2009-05-04 6 views
24

これは私のprevious questionと密接に関連しています。これはCMakeを使ってiPhone上に静的ライブラリを構築することでした。私はCMAKE_OSX_SYSROOTの設定作業をしました。iPhone用のアプリケーションをビルドするCMakeを設定する方法

ただし、これはアプリを構築するためには機能しません。

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}) 

いくつかの注意事項:私は明示的にfind_libraryは、フレームワークのすべてのために動作しませんでしたので、-frameworkリンクするオプションを与えている

  • (それはそれらのほとんどを見つけましたが、私のCMakeLists.txtは次のようになりますいいえ。OpenGLES)。彼らはすべて同じフォルダにあるので、私は理由を理解していません${SDK}/System/Library/Frameworks。これは、私が何か間違っていると信じるように導くが、私は何が分からない。
  • add_executableコマンドにMACOSX_BUNDLEを追加して、生成された製品タイプがcom.apple.product-type.toolの代わりにcom.apple.product-type.applicationになるようにしました。これは明らかにiPhoneには存在しません。いずれの場合においても

、アプリがコンパイルとリンクが正しく、私はシミュレータでそれを実行すると、私は恐ろしい

Failed to launch simulated application: Unknown error. 

はグーグルとstackoverflowの上でこの問題の報告事例がたくさんあります取得しますしかし、すべてのソリューションには、クリーンアップや新しいプロジェクトの作成、ファイルの移動が含まれます。私はCMakeがその仕事をした後に新鮮なコピーを集めているので、それは当てはまりません。

私はthis threadをCMakeメーリングリストで見つけましたが、図書館の構築に成功したことを報告してからはじめて出てきます。

答えて

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ライブラリを構築して、簡単に右にリンクできますユニバーサルバイナリについて心配するのではなく、1つです。

また、CMakeを使用してプロジェクトをビルドするときにXcodeがリソースを適切に追加していないようですので、この部分をCMakeLists.txtファイルに追加しました。これは、フォルダ/data全体を自分のresourcesフォルダにコピーします(Xcodeに "blue"フォルダリンクが追加されているかのように)。

# 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

+2

リソースのために別の方法があります。こちらをご覧ください:http: /cmake.org/gitweb?p=cmake.git;a=blob;f=Tests/iOSNavApp/CMakeLists.txtしかし、これはディレクトリ階層を削除するので、重複するファイル名は問題になります。 –

1

あなたが明示的にフラグを「-x Objective-Cの++」を追加する必要はありませんので、最近のcmakeのバージョンは、拡張を介して言語を検出し、C++コンパイラ、への.mと.mmファイルを渡します。フレームワークの

+2

ああ、それはちょうど偶然ですスクリプトに私は実際に.cppファイルがほとんど(私はクロスコンパイルしているので)必要です。 –

+0

@JesseBeder:なぜ '.cpp'ファイルをobjective-C++としてコンパイルしますか? '.cpp'ファイルをC++としてコンパイルし、Cocoaと対話する必要のあるプラットフォーム固有の機能を持つ少数の' .mm'ファイルを用意しています。 –

+0

@JanHudec、私の '.cpp'ファイルの中には、条件付きでObjective-C('#ifdef')が含まれているので、iPhone用にコンパイルするとObjective-Cとやりとりします(Objective-C++と考えるべきです)しかし、PC用にコンパイルされても、C++とはみなされません。 –

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のために働くありません。

+0

これは、 "Other Linker Flags" AKA OTHER_LDFLAGSのフレームワークを追加するようですが、ヘッダー "Header Search Paths" AKA HEADER_SEARCH_PATHSに何も追加しないので、私のコードはUIKit/UIKit.hを見つけることができません。提案? – Emmanuel

関連する問題