这是密切相关的我 前一个问题, ,这是关于使用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 来的 add_executable 命令使得该产品的类型产生的将是 com.apple.product-type.application 而不是的 com.apple.product-type.tool, 显然不存在。

在任何情况下,应用程序汇编和链接,正确的,但当我运行了它在该模拟中,我获得可怕

Failed to launch simulated application: Unknown error.

有很多报告的实例,这个问题上,谷歌和计算器,但是所有的解决方案涉及清理或创建一个新的项目和运动的文件;但是我编的新副本,后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 如上所述,这样,如果应用的链接到一个静态的图书馆(特别是一个通用的(non-的iPhone)图书馆),可以建立独立的iPhoneOS和iPhoneSimulator图书馆和轻松链接到正确的,而不是担心一个通用的二进制的。

此外,工业化似乎不适当地增加资源时建立的项目使用CMake,因此我添加这一块的 CMakeLists.txt 文件。它将整个文件夹 /data 进入我的资源文件夹(因为如果我已经增加了一个"蓝色"的文件夹中的链接模式).

# 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)

这工作用于评价。

最近CMake版本通行证。m。毫米的文件C++编译器,检测到的语言,通过扩展,所以你不需要添加"-x目标-c++"的标志明确。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top