我当时正在为一个项目学习CMake,在链接库时感到很困惑。
我觉得用一个例子来问比较容易,因为使用我不熟悉的术语可能会误导人。
这些问题(在示例代码中也有注释)
示例
假设我正在编写一些依赖于Hermes图书馆的测试。然后编写一个CMakeList.txt文件,如下所示
cmake_minimum_required(VERSION 3.13)
project(mytests_cxx)
set(CMAKE_CXX_STANDARD 14)
include(FetchContent)
FetchContent_Declare(
hermes
URL https://github.com/facebook/hermes/archive/d63feeb46d26fe0ca7e789fc793f409e5158b27f.zip
)
FetchContent_MakeAvailable(hermes)
enable_testing()
add_executable(
hello_test
./test.cpp
)
find_library (
LIB_HERMES
hermes # <- how can I know what is the name?
)
find_library (
LIB_JSI
jsi # <- How could I use a "grandchild" dependency, it is defined here (https://github.com/facebook/hermes/tree/main/API/jsi/jsi)
)
target_link_libraries(
hello_test
gtest_main <- Hermes seems to use gtest, how could make sure gtest_main is available?
LIB_HERMES
LIB_JSI
)
include(GoogleTest)
gtest_discover_tests(hello_test)运行cmake以生成
cmake -S . -B build -DHERMES_BUILD_SHARED_JSI=ON // I see an option defined in heremes'CMakeLists.txt but not sure if I am using it right.构建中的目录
tree ./build -L 2
./build
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.23.1
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeError.log
│ ├── CMakeOutput.log
│ ├── CMakeRuleHashes.txt
│ ├── CMakeTmp
│ ├── Makefile.cmake
│ ├── Makefile2
│ ├── Progress
│ ├── TargetDirectories.txt
│ ├── cmake.check_cache
│ ├── hello_test.dir
│ └── progress.marks
├── CTestTestfile.cmake
├── ImportHermesc.cmake
├── Makefile
├── _deps
│ ├── hermes-build
│ ├── hermes-src
│ └── hermes-subbuild
├── bin
│ └── hermes-lit
├── cmake_install.cmake
├── compile_commands.json
└── hello_test[1]_include.cmake然后运行cmake --build build并看到这个错误
/.../test.cpp:8:10: fatal error: 'jsi/jsi.h' file not found
#include <jsi/jsi.h>发布于 2022-05-20 17:35:36
你的问题太宽泛了。或者问有关cmake中库列表的问题,或者问如何编译和链接到hermes,或者问一个关于构建包含第三方的特定问题的问题。这些应该是三个单独的问题在这个网站上。
我如何知道我可以链接到目标的库名是什么?
有两件事您可以target_link_libraries -您可以链接到您的系统上可用的库和链接到在cmake中定义的目标。
您可以通过遍历ld --verbose输出的所有路径并列出这些目录中的所有lib*.so文件来列出系统上可用的库。或者https://unix.stackexchange.com/questions/43187/how-do-i-get-a-list-of-shared-library-filenames-under-linux或者类似的。见man ld.so。
可以列出cmake中定义的所有目标。如何从命令行列出已定义的make目标?。
这些列表由您可以链接的所有可能的库名称组合而成。
我能从构建文件结构中看出这一点吗?
我什么都不了解。不是的。
我需要查看外部库的CMakeLists.txt
是的,通常您希望查看任何外部库CMakeLists.txt,至少要检查恶意代码。
您通常查看外部库的文档。而且,因为源代码是开源项目中文档的一种形式,所以您可以查看源代码,是的。
如何使用作为外部库一部分的“外孙”库?
包含外部项目的方法有多种。病例在在cmake项目中正确使用第三方库的方法中作了概述。
也就是说,并不是所有的CMake项目都能正确地使用add_subdirectory() (由FetchContent_MakeAvailable调用)--在许多情况下,第三方项目CMakeLists.txt可能无法与父项目协同工作。在这种情况下,我将继续编译项目并将其安装到子目录中,例如在运行CMake或使用ExternalProject_Add之前,然后只包含手工构建的find_library和target_include_directories从安装目录编译的结果。
总的来说,包含第三方并不总是一项容易的任务,是的,它要求您熟悉第三方项目的细节、它是如何工作的以及它是如何编写的,并决定如何将其包含到您的项目中。
https://stackoverflow.com/questions/72322122
复制相似问题