首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪些库可以在cmake中链接?

哪些库可以在cmake中链接?
EN

Stack Overflow用户
提问于 2022-05-20 16:32:47
回答 1查看 247关注 0票数 -2

我当时正在为一个项目学习CMake,在链接库时感到很困惑。

我觉得用一个例子来问比较容易,因为使用我不熟悉的术语可能会误导人。

这些问题(在示例代码中也有注释)

  1. 我如何知道我可以链接到目标的库名是什么?我能从构建文件结构中看出这一点吗,或者我需要查看外部库的CMakeLists.txt。(例如示例中的gtest-main和libhermes )
  2. 如何使用作为外部库一部分的“外孙”库?(例如示例中的jsi库)

示例

假设我正在编写一些依赖于Hermes图书馆的测试。然后编写一个CMakeList.txt文件,如下所示

代码语言:javascript
复制
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以生成

代码语言:javascript
复制
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.

构建中的目录

代码语言:javascript
复制
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并看到这个错误

代码语言:javascript
复制
/.../test.cpp:8:10: fatal error: 'jsi/jsi.h' file not found
#include <jsi/jsi.h>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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_librarytarget_include_directories从安装目录编译的结果。

总的来说,包含第三方并不总是一项容易的任务,是的,它要求您熟悉第三方项目的细节、它是如何工作的以及它是如何编写的,并决定如何将其包含到您的项目中。

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

https://stackoverflow.com/questions/72322122

复制
相关文章

相似问题

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