这与我之前的问题密切相关,该问题是关于使用CMake在iPhone上构建静态库.我得到了工作设置CMAKE_OSX_SYSROOT
.
但是,这不适用于构建应用程序.我CMakeLists.txt
看起来像:
project(TEST) set(CMAKE_OSX_SYSROOT iphoneos2.2.1) set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_BIT)") set(CMAKE_EXE_LINKER_FLAGS "-framework Foundation -framework OpenGLES -framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit -framework OpenAL" ) set(SRC --my files--) add_executable(iphone-test MACOSX_BUNDLE ${SRC})
几点说明:
我明确给出了-framework
链接选项,因为它find_library
不适用于所有框架(它找到了大部分框架,但没有找到OpenGLES
).我不明白为什么,因为他们都在同一个文件夹中${SDK}/System/Library/Frameworks
.这让我相信我做错了什么,但我不知道是什么.
我添加MACOSX_BUNDLE
到add_executable
命令中,以便生成的产品类型com.apple.product-type.application
代替com.apple.product-type.tool
,而iPhone上显然不存在.
在任何情况下,应用程序编译和链接正确,但当我在模拟器中运行它时,我得到了可怕的
Failed to launch simulated application: Unknown error.
google和stackoverflow上有很多报告此问题的实例,但所有解决方案都涉及清理或创建新项目和移动文件; 但是我在CMake完成它的工作后正在编译一份新的副本,所以这些都不适用.
我在CMake邮件列表上找到了这个帖子,但它只报告了构建库的成功,然后逐渐消失.
我终于想出了如何做到这一点.这是我的CMakeLists.txt
文件的样子:
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")
显然,请更改mycompany
为您的公司名称,并更改My Name
为您的姓名.我发现\${HOME}/\${SDKROOT}/lib
如上所述添加链接目录非常有用,这样如果您的应用程序链接到静态库(尤其是通用(非iPhone)库),您可以构建单独的iPhoneOS和iPhoneSimulator库并轻松链接到正确的库而不是担心通用的二进制文件.
此外,当您使用CMake构建项目时,Xcode似乎没有正确添加资源,因此我将此片段添加到CMakeLists.txt
文件中.它将整个文件夹复制/data
到我的资源文件夹中(就好像我在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} )
对于框架,我发现此消息http://www.mail-archive.com/cmake@cmake.org/msg24659.html我抓住了足够的信息:
SET(TARGETSDK iPhoneOS3.1.2.sdk) SET(CMAKE_OSX_SYSROOT /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/${TARGETSDK}) macro(ADD_FRAMEWORK fwname appname) find_library(FRAMEWORK_${fwname} NAMES ${fwname} PATHS ${CMAKE_OSX_SYSROOT}/System/Library PATH_SUFFIXES Frameworks NO_DEFAULT_PATH) if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND) MESSAGE(ERROR ": Framework ${fwname} not found") else() TARGET_LINK_LIBRARIES(${appname} ${FRAMEWORK_${fwname}}) MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}") endif() endmacro(ADD_FRAMEWORK)
现在我做的不是设置CMAKE_EXE_LINKER_FLAGS:
ADD_FRAMEWORK(AudioToolbox MyApp) ADD_FRAMEWORK(CoreGraphics MyApp) ADD_FRAMEWORK(QuartzCore MyApp) ADD_FRAMEWORK(UIKit MyApp)
这也适用于OpenGLES.