web-dev-qa-db-ja.com

iPhone用のアプリを構築するためにCMakeを設定する方法

これは私の 前の質問 と密接に関連しています。これは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.

グーグルとスタックオーバーフローでこの問題の報告されたインスタンスはたくさんありますが、すべての解決策には、新しいプロジェクトのクリーンアップまたは作成とファイルの移動が含まれます。しかし、CMakeが機能した後、新しいコピーをコンパイルしているので、それは当てはまりません。

CMakeメーリングリストで このスレッド を見つけましたが、ライブラリの構築が成功したことを報告するだけで、その後はペタリングします。

25
Jesse Beder

私はついにこれを行う方法を理解しました。 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}
)
42
Jesse Beder

最近のCMakeバージョンは.mファイルと.mmファイルをC++コンパイラに渡します。C++コンパイラは拡張子を介して言語を検出するため、フラグに「-xobjective-c ++」を明示的に追加する必要はありません。

1
Nicolas