문제

이것은 내와 밀접한 관련이 있습니다 이전 질문, 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.

Google 및 StackoverFlow에는이 문제의보고 된 사례가 많이 있지만 모든 솔루션에는 새 프로젝트를 정리하거나 생성하고 파일 이동하는 것이 포함됩니다. 그러나 CMAKE가 작동 한 후에 신선한 사본을 컴파일하고 있으므로 그 중 어느 것도 적용되지 않습니다.

나는 찾았다 이 스레드 Cmake 메일 링리스트에서는 도서관 구축에 성공한 다음 Peters Out만으로도 성공했습니다.

도움이 되었습니까?

해결책

나는 마침내이 작업을 수행하는 방법을 알아 냈습니다. 여기 내 것입니다 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 위와 같이, 앱이 정적 라이브러리 (특히 제네릭 비) 라이브러리로 연결되면 별도의 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}
)

다른 팁

프레임 워크의 경우이 메시지를 찾았습니다 http://www.mail-achive.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)

이것은 개방형에도 효과가 있습니다.

최근 CMAKE 버전은 .m 및 .mm 파일을 C ++ 컴파일러로 전달하여 확장자를 통해 언어를 감지하므로 플래그에 "-x objective-c ++"를 명시 적으로 추가 할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top