2009-05-04 126 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工作爲好。

相關問題