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/
我在做-
cmake ../ -G Xcode -D CMAKE_TOOLCHAIN_FILE=../iOS.cmake -D IOS_PLATFORM=SIMULATOR
xcodebuild -target install -configuration Debug
基本上发生了什么,我正在构建两个库,一个在 core/
中,它计算一个数字的平方根,另一个在 platform/
中,它是 C++ 平方根计算库上的 ObjC 包装器.我正在 linking 平台/库中的核心/库。
问题:
问题是,我无法 link 在 core/
内生成的库,以及在 platform/
内生成的库。代码构建得很好,并且生成了库(和相应的 .h 头文件)。
但是,如果我尝试在我的 Xcode 中使用它,它会这样说:
显然,core/
库函数在 platform/
中不可访问。
我尝试摆弄 C
和 CXX
标志,尝试先使用 find_library
添加库,然后使用不同的工具链,例如 this 一个在这里还有。
平台规格:
- MacOS Big Sur,11.6.5,2.3 Ghz i9
- CMake - 3.22.2
- Xcode - 13.2.1
假设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.a
和 libA.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”。
我创建了一个简约的 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/
我在做-
cmake ../ -G Xcode -D CMAKE_TOOLCHAIN_FILE=../iOS.cmake -D IOS_PLATFORM=SIMULATOR
xcodebuild -target install -configuration Debug
基本上发生了什么,我正在构建两个库,一个在 core/
中,它计算一个数字的平方根,另一个在 platform/
中,它是 C++ 平方根计算库上的 ObjC 包装器.我正在 linking 平台/库中的核心/库。
问题:
问题是,我无法 link 在 core/
内生成的库,以及在 platform/
内生成的库。代码构建得很好,并且生成了库(和相应的 .h 头文件)。
但是,如果我尝试在我的 Xcode 中使用它,它会这样说:
显然,core/
库函数在 platform/
中不可访问。
我尝试摆弄 C
和 CXX
标志,尝试先使用 find_library
添加库,然后使用不同的工具链,例如 this 一个在这里还有。
平台规格:
- MacOS Big Sur,11.6.5,2.3 Ghz i9
- CMake - 3.22.2
- Xcode - 13.2.1
假设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.a
和libA.a
太有用了
- 例如:
Dynamic/Shared 库:依赖项b/w 库已解析;只需指定最终可执行文件所需的依赖项就足够了
- 您仍然需要确保两个 .dylib 位于同一目录中,以便
libB.dylib
加载libA.dylib
- 您仍然需要确保两个 .dylib 位于同一目录中,以便
所以,要么创建一个动态库,要么在Xcode中添加静态库的所有依赖。
在Core/CMakeLists.txt中,您可以添加:
target_include_directories(core_lib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
在 link 和 core_lib 的另一个目标中,它将包含目录“Core”。