这与我的previous question密切相关,这是关于使用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上不存在。< / LI>
在任何情况下,应用程序都会正确编译和链接,但是当我在模拟器中运行它时,我会感到害怕
Failed to launch simulated application: Unknown error.
google和stackoverflow上有很多关于此问题的报告实例,但所有解决方案都涉及清理或创建新项目和移动文件;但是我在CMake完成其工作后正在编写一份新的副本,所以这些都不适用。
我在CMake邮件列表上找到了this thread,但它只报告了构建库的成功,然后逐渐消失。
答案 0 :(得分:42)
我终于想出了如何做到这一点。这是我的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}
)
答案 1 :(得分:8)
对于框架,我发现了这条消息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。
答案 2 :(得分:1)
最近的CMake版本将.m和.mm文件传递给C ++编译器,C ++编译器通过扩展来检测语言,因此您不需要在标志中明确添加“-x objective-c ++”。