gpt4 book ai didi

c++ - 如何链接从 CMake 中的 add_subdirectory 创建的库?

转载 作者:行者123 更新时间:2023-11-30 04:47:30 24 4
gpt4 key购买 nike

我正在尝试使用依赖于第三方库的 CMake 构建程序。这个第三方库包含一个 CMakeLists.txt 文件,所以我想做的是将第三方库的源代码保存在我的项目目录中,并使用 add_subdirectory(path/to/lib),然后将我的目标链接到第三方库生成的静态库。

我的 CMakeLists.txt:

cmake_minimum_version(VERSION 3.10)
project(my_project)

add_subdirectory("${CMAKE_SOURCE_DIR}/extern/somelib")

# my-code:
# somelib CMakeLists.txt file has a project name: SOMELIB
# which lets me access the directory where the files are built
# on windows it builds to /Release, on mac and linux it just builds
# to the binary dir
set(SOMELIB_LIBS "${SOMELIB_BINARY_DIR}/Release")
add_executable(my_program my_main.cpp)
target_link_libraries(my_program "${SOMELIB_LIBS}/SOMELIB.lib" "${SOMELIB_LIBS}/SOMELIBmain.lib")

然后我创建一个构建目录,并从该目录开始:

cmake -G "Visual Studio 15 2017" ..
cmake --build .

构建命令失败,出现“LINK: fatal error LNK1181:无法打开输入文件‘extern/somelib/Release/SOMELIBmain.lib’...”

我现在的解决方法是注释掉“#my-code”部分,首先构建生成静态库的 somelib 依赖项,然后取消注释掉我的代码并再次构建,这样就可以正常工作了。

我如何告诉 CMake 先构建子目录,然后链接到它生成的静态库?

最佳答案

简短回答:告诉 CMake 它的目标之间存在依赖关系。

target_link_libraries(my_program PRIVATE SOMELIB SOMELIBmain)

CMake 将为您评估 SOMELIB 的位置并链接 my_program反对SOMELIBSOMELIBmain [1]。适用于调试和发布配置以及 Linux。

您不必担心 CMake 将构建文件放在哪里[2],这就是所谓的“现代 CMake”正在努力实现的目标。我将在此处留下简要说明,但请查看答案底部的链接[3]

无论如何,关键概念是无论何时创建库/可执行文件(目标),您都会列出其使用+构建要求和对其他目标的依赖性。您使用 target_link_libraries(<your_lib> KEYWORD <dependencies>) 声明依赖项.这样的行不仅会使<you_lib>链接列出的依赖项,它将继承它们的使用要求(通常是公共(public)包含目录)并命令 CMake 在 <your_lib> 之前构建依赖库.

它的美妙之处在于即使SOMELIB不遵循现代 CMake 思想(不声明构建/使用要求),您仍然应该能够只使用这一行。

[1] 我假设 CMake 目标的命名与输出库名称相同,但这不是强制性的。对于 OP 的情况,事实证明静态库目标以 -static 为后缀。 , 所以他不得不写 SOMELIB-static SOMELIBmain-static

[2] 不幸的是,Windows 上的共享库 (DLL) 并不那么容易

[3] 我将从这篇博文开始:https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/

关于c++ - 如何链接从 CMake 中的 add_subdirectory 创建的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56210202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com