2009-05-04 4 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}) 

몇 가지 참고 사항 : I 명시 적으로 find_library이 프레임 워크의 모든 작동하지 않았기 때문에 -framework 연결 옵션을 제공하고있어

  • (그들의 대부분을 찾았지만 내 CMakeLists.txt처럼 보이는 not 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. 

가 구글과 유래에이 문제가보고 된 경우가 많이 있습니다 얻을 그러나 모든 솔루션에는 정리 작업이나 새 프로젝트 생성 및 파일 이동 작업이 포함됩니다. CMake가 작업을 마친 후 새로운 복사본을 컴파일하고 있으므로 그 중 아무 것도 적용되지 않습니다.

나는 CMake 메일 링리스트에서 this thread을 찾았지만, 도서관을 짓는 데 성공한 것으로보고하고 나서 크게 웃었다.

답변

41

마침내이 작업을 수행하는 방법을 알았습니다. 분명히

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을 변경 : 여기 내 CMakeLists.txt 파일의 모습입니다. 위와 같이 링크 디렉토리 \${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} 
) 
+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

최근 CMake 버전은 확장을 통해 언어를 감지 C++ 컴파일러로하는 .m 및 .mm 파일을 통과, 그래서 당신은 명시 적으로 플래그에 "-x 목표 - C++"를 추가 할 필요가 없습니다.프레임 워크에 대한

+2

오, 그래, 그냥 부수적인데. 스크립트에. 나는 실제로 .cpp 파일을 주로 가지고 있기 때문에 (cross-compiling), 필자는 그것을 필요로한다. –

+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

관련 문제