Xcode,CMake 无法 link C++ 库与 ObjC++ 库

Xcode, CMake unable to link C++ library with ObjC++ library

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

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

项目 link - https://github.com/devojoyti/CMakeLibrary

里面build/我在做-

基本上发生了什么,我正在构建两个库,一个在 core/ 中,它计算一个数字的平方根,另一个在 platform/ 中,它是 C++ 平方根计算库上的 ObjC 包装器.我正在 linking 平台/库中的核心/库。

问题:

问题是,我无法 link 在 core/ 内生成的库,以及在 platform/ 内生成的库。代码构建得很好,并且生成了库(和相应的 .h 头文件)。

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

显然,core/ 库函数在 platform/ 中不可访问。

我尝试摆弄 CCXX 标志,尝试先使用 find_library 添加库,然后使用不同的工具链,例如 this 一个在这里还有。

平台规格:

假设libcore_lib.a在核心/

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

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

  • 我生成的库是静态库。
  • 静态库无法自行解析它们的依赖关系(即,此处 platform/ 中的库无法解析其对 core/ 的依赖关系),除非我明确地将它们都添加到 Xcode .
  • 在 Xcode.
  • 中添加两个库(core/ 库和 platform/)后它开始工作

解释:

  • 静态库:虽然您指定了依赖项,但工具链并未解析它。您必须指定对最终可执行文件的所有依赖项。

    • 例如:libB 依赖于 libA 然后当链接 hello.exe 时只调用 libB 的方法你必须同时指定 libB.alibA.a 太有用了
  • Dynamic/Shared 库:依赖项b/w 库已解析;只需指定最终可执行文件所需的依赖项就足够了

    • 您仍然需要确保两个 .dylib 位于同一目录中,以便 libB.dylib 加载 libA.dylib

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

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

target_include_directories(core_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

在 link 和 core_lib 的另一个目标中,它将包含目录“Core”。