【问题标题】:Can't link MacOS frameworks with CMake无法将 MacOS 框架与 CMake 链接
【发布时间】:2012-09-14 21:14:50
【问题描述】:

我正在尝试使用 cmake 构建一个子项目(它不是一个 xcode 项目甚至是 iphone 的应用程序,结果是跨平台控制台可执行文件,其中 #includes 一些继承自 C++ 抽象类,用objective-c++编写)

我正在使用本指南链接 mac os 框架:http://www.vtk.org/Wiki/CMake:HowToUseExistingOSXFrameworks

还有这个宏:

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)

这是 CMakeLists.txt 中的重要部分

project(myprojectname)
........
add_executable(mytarget src/mytarget.cpp)

add_framework(CoreMedia mytarget)
add_framework(CoreVideo mytarget)
add_framework(AVFoundation mytarget)
add_framework(Foundation mytarget)
........

这就是我在尝试构建时所拥有的:

WARNING: Target "mytarget" requests linking to directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/CoreMedia.framework".  Targets may link only to libraries.  CMake is dropping the item.
WARNING: Target "mytarget" requests linking to directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/CoreVideo.framework".  Targets may link only to libraries.  CMake is dropping the item.
WARNING: Target "mytarget" requests linking to directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/AVFoundation.framework".  Targets may link only to libraries.  CMake is dropping the item.
WARNING: Target "mytarget" requests linking to directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/Foundation.framework".  Targets may link only to libraries.  CMake is dropping the item.

它实际上找到了所有这些框架,但无法链接,这会产生很多链接器错误。我很确定这就是原因,因为我使用 XCode 制作了一个 testproj,并且在我链接所有需要的框架之前它具有相同的错误。

当我刚刚使用时

FIND_LIBRARY(COREMEDIA_LIB CoreMedia)
...

然后COREMEDIA_LIB 设置为NOTFOUND - 发生了什么? :/

我用谷歌搜索了很多,但什么也没有:(感觉很迷茫。

【问题讨论】:

  • 好吧,它可以与set(CMAKE_EXE_LINKER_FLAGS "-framework fm1-framework fm2..." 一起使用,为什么stackoverflow.com/questions/822404/… 方式不起作用? (我实际上尝试使用的那个宏的答案)

标签: ios frameworks linker cmake


【解决方案1】:

明白了:您必须链接不是TARGET_LINK_LIBRARIES 中的frameworkname.framework 文件夹,而是fwname.framework/fwname 文件!现在它就是这样工作的。

修改后的宏是这样的:

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}}/${fwname}")
        MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}")
    endif()
endmacro(ADD_FRAMEWORK)

希望它对某人有用...

【讨论】:

  • 这似乎在“其他链接器标志”AKA OTHER_LDFLAGS 中添加了框架,但它没有向标题“标题搜索路径”AKA HEADER_SEARCH_PATHS 添加任何内容,因此我的代码找不到 UIKit/UIKit 。H。有什么建议吗?
  • 在我的例子中,没有设置 OTHER_LDFLAGS(或者,它们似乎设置为空值,因为 Xcode Build 设置窗格中的标签是粗体的。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多