How to set up CMake to build an app for the iPhone

前端 未结 3 658
栀梦
栀梦 2020-12-02 07:55

This is closely related to my previous question, which was about using CMake to build a static library on the iPhone. I got that to work setting the CMAKE_OSX_SYSROOT<

3条回答
  •  无人及你
    2020-12-02 08:24

    I finally figured out how to do this. Here's what my CMakeLists.txt file looks like:

    project(test)
    set(NAME test)
    
    file(GLOB headers *.h)
    file(GLOB sources *.cpp)
    
    set(CMAKE_OSX_SYSROOT iphoneos2.2.1)
    set(CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_BIT))
    set(CMAKE_CXX_FLAGS "-x objective-c++")
    set(CMAKE_EXE_LINKER_FLAGS
        "-framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit"
    )
    link_directories(\${HOME}/\${SDKROOT}/lib)
    
    set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.mycompany.\${PRODUCT_NAME:identifier}")
    set(APP_TYPE MACOSX_BUNDLE)
    
    add_executable(${NAME}
        ${APP_TYPE}
        ${headers}
        ${sources}
    )
    
    target_link_libraries(${NAME}
        # other libraries to link
    )
    
    # code signing
    set_target_properties(${NAME} PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name")
    

    Obviously, change mycompany to your company name, and change My Name to your name. I found it's very useful to add the link directory \${HOME}/\${SDKROOT}/lib as above, so that if your app links to a static library (especially a generic (non-iPhone) library), you can build separate iPhoneOS and iPhoneSimulator libraries and easily link to the right one, instead of worrying about a universal binary.

    Also, Xcode doesn't seem to properly add resources when you build the project using CMake, so I added this piece to the CMakeLists.txt file. It copies the entire folder /data into my resources folder (as if I had added a "blue" folder link in Xcode).

    # copy resource phase
    
    set(APP_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME})
    set(RES_DIR ${test_SOURCE_DIR}/data)
    add_custom_command(
        TARGET ${NAME}
        POST_BUILD
        COMMAND /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources/pbxcp -exclude .DS_Store -exclude CVS -exclude .svn -resolve-src-symlinks ${RES_DIR} ${APP_NAME}
    )
    

提交回复
热议问题