2009-05-04 131 views
24

这与我的previous question密切相关,这是关于使用CMake在iPhone上构建静态库的。我得到这个工作设置CMAKE_OSX_SYSROOT如何设置CMake为iPhone构建应用程序

但是,这不适用于构建应用程序。我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. 

有很多关于谷歌和计算器这个问题的报告实例,但所有解决方案都涉及清理或创建新项目和移动文件;但是在CMake完成它的工作之后,我正在编译一份新的副本,所以这些都不适用。

我在CMake邮件列表上发现了this thread,但它只报告构建库的成功,然后逐出。

回答

41

我终于想出了如何做到这一点。下面是我的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} 
) 
+0

我发现你的答案非常有帮助 - 我真的迷失在CMake和Xcode中。我尝试使用CMakeLists文件的稍微修改版本。但是,我遇到了一些奇怪的问题。你可以看看我的问题吗? http://stackoverflow.com/questions/5473448/cmake-and-xcode-cannot-find-interface-declaration-for-nsobject在此先感谢:) – Shade 2011-03-29 14:11:39

+2

现在有另一种资源的方式,请参阅此处:http:///cmake.org/gitweb?p=cmake.git;a=blob;f=Tests/iOSNavApp/CMakeLists.txt但是,这将删除目录层次结构,所以重复的文件名是一个问题... – 2013-06-27 14:58:26

1

最新版本的CMake通过.M和.mm文件到C++编译器,它可以检测通过扩展的语言,所以你并不需要“-x的Objective-C++”添加到标志明确。

+2

哦,是的,这只是偶然到脚本。我其实主要是.cpp文件(因为我正在交叉编译),所以我确实需要它。 – 2009-07-08 02:29:02

7

对于框架,我发现这个消息http://www.mail-archive.com/[email protected]/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工作为好。

相关问题