首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode,CMake无法将C++库与ObjC++库链接

Xcode,CMake无法将C++库与ObjC++库链接
EN

Stack Overflow用户
提问于 2022-04-01 08:42:55
回答 3查看 504关注 0票数 1

我已经创建了一个极简式的C++库,我想在我的Xcode项目中使用它。它有这个目录结构-

代码语言:javascript
复制
library/
 
    - CMakeLists.txt
    - build/    // build files will reside here 
    - iOS.cmake // toolchain file
    - core/
        - CMakeLists.txt
        - squareroot.h
        - squareroot.cpp
    - platform/
        - CMakeLists.txt
        - squrerootwrapper.h
        - squarerootwrapper.mm

项目链接- https://github.com/devojoyti/CMakeLibrary

build/里面我在做-

  • cmake ../ -G Xcode -D CMAKE_TOOLCHAIN_FILE=../iOS.cmake -D IOS_PLATFORM=SIMULATOR
  • xcodebuild -target install -configuration Debug

基本上,我正在构建两个库,一个在core/中,计算一个数字的squareroot,另一个在platform/中,它是C++ squareroot计算库上的一个ObjC包装器。我正在将核心/库链接到平台/库中。

问题:

问题是,我无法将在core/中生成的库与在platform/中生成的库链接起来。代码构建得很好,并且生成了库(以及相应的.h头文件)。

但是,如果我试图在我的Xcode中使用它,它会这样说:

显然,core/库函数在platform/内部是不可访问的。

我尝试过修改CCXX标志,尝试首先使用find_library添加库,并使用不同的工具链,例如,这里的 one。

平台规格:

  • MacOS Big,11.6.5,2.3GHz i9
  • CMake - 3.22.2
  • Xcode - 13.2.1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-05 09:54:22

好吧,我终于明白问题出在哪里了。

  • 我正在生成的库是静态库。
  • 静态库无法自行解决它们的依赖关系(在这里,platform/中的库不能解决其对core/的依赖),除非我将两者显式地添加到Xcode中。
  • 我在Xcode中添加了两个库(core/库和platform/)之后,它就开始工作了。

Explanation:

  • 静态库:虽然您指定了一个依赖项,但它没有被工具链解析。您必须指定最终可执行文件的所有依赖项。
代码语言:javascript
复制
- e.g: `libB` depends on `libA` then when linking hello.exe which only calls methods of `libB` you've to specify both `libB.a` AND `libA.a` too for it to work
  • 动态/共享库:解决了依赖关系b/w库;仅指定最终可执行文件所需的依赖关系就足够了
代码语言:javascript
复制
- You'd still have to make sure both .dylibs are in the same directory for `libB.dylib` to load `libA.dylib`

因此,要么创建一个动态库,要么在Xcode中添加静态库的所有依赖项。

票数 2
EN

Stack Overflow用户

发布于 2022-04-03 10:03:49

假设libcore_lib.a位于核心/

代码语言:javascript
复制
find_package(CORE core_lib HINTS ${PROJECT_SOURCE_DIR}/core)
include_directories(${PROJECT_SOURCE_DIR}/core)
add_library(pim_ios ${PLATFORM_SOURCES})
target_link_libraries(pim_ios ${CORE})
target_link_libraries(pim_ios PUBLIC "-framework Cocoa" "-framework AppKit" "-framework CoreData" "-framework Foundation")
票数 0
EN

Stack Overflow用户

发布于 2022-04-08 08:25:58

在Core/CMakeLists.txt中,可以添加:

代码语言:javascript
复制
target_include_directories(core_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

在与core_lib链接的另一个目标中,它将包含目录"Core“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71704144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档