iPhone用のアプリをビルドするためにCMakeをセットアップする方法

StackOverflow https://stackoverflow.com/questions/822404

  •  03-07-2019
  •  | 
  •  

質問

これは私の前の質問。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})

いくつかのメモ:

  • すべてのフレームワークで find_library が機能しなかったため、 -framework リンクオプションを明示的に指定しています(ほとんどのフレームワークは見つかりましたが、 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.

googleおよびstackoverflowにはこの問題の報告例が多数ありますが、すべてのソリューションには、新しいプロジェクトのクリーンアップまたは作成とファイルの移動が含まれます。しかし、CMakeが機能した後に新しいコピーをコンパイルしているので、該当するものはありません。

CMakeメーリングリストでこのスレッドを見つけました、しかし、それはライブラリの構築に成功したことを報告し、それからピーターアウトします。

役に立ちましたか?

解決

これを行う方法をようやく見つけました。 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に" 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}
)

他のヒント

フレームワークの場合、このメッセージを見つけました http://www.mail -archive.com/cmake@cmake.org/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でも機能します。

最新のCMakeバージョンは、.mおよび.mmファイルをC ++コンパイラに渡します。C++コンパイラは拡張機能を通じて言語を検出するため、「-x Objective-C ++」を追加する必要はありません。フラグに明示的に。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top