これは私の前の質問、これは iPhone 上で CMake を使用して静的ライブラリを構築するというものでした。 を設定することで、これを機能させることができました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
に追加しましたが、どうやら iPhone には は存在しないようです。add_executable
com.apple.product-type.application
com.apple.product-type.tool
いずれにせよ、アプリは正しくコンパイルされリンクされますが、シミュレータで実行すると、恐ろしい
Failed to launch simulated application: Unknown error.
Google や stackoverflow にはこの問題の報告例が多数ありますが、すべての解決策には、クリーンアップまたは新しいプロジェクトの作成とファイルの移動が含まれます。ただし、CMake が作業を行った後に新しいコピーをコンパイルしているので、そのどれも当てはまりません。
私は見つけたこのスレッドCMake メーリング リストで、ライブラリの構築が成功したことのみが報告され、その後は消えてしまいます。
ベストアンサー1
ようやくやり方が分かりました。ファイルは次のようになります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}
)