如何链接从cmake中的add_subdirectory创建的库

How to link a library that was created from add_subdirectory in CMake?

本文关键字:add subdirectory 创建 中的 cmake 何链接 链接      更新时间:2023-10-16

我正在尝试使用取决于第三方库的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 .

构建命令失败,链接"链接:致命错误lnk1181:无法打开输入文件'extern/somelib/repares/repares/somelibmain.lib'...&quort'

我现在的解决方法是评论说"#my-code"的部分,首先构建somelib依赖性,该依赖性首先生成静态库,然后删除my-code并再次构建,然后再构建,然后才能正常工作。

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

简短答案:告诉cmake其目标之间存在依赖性。

target_link_libraries(my_program PRIVATE SOMELIB SOMELIBmain)

cmake将为您评估Somelibs位置,并针对SOMELIBSOMELIBmain [1] 链接my_program。适用于调试和发布配置,也适用于Linux。

您不必担心cmake cloce构建文件 [2] ,这就是所谓的"现代Cmake"正在尝试实现的目标。我将在这里简要说明,但请检查答案底部的链接 [3]

无论如何,关键概念是,每当您创建库/可执行文件(目标(时,您就会列出其用法 构建要求以及对其他目标的依赖。您使用target_link_libraries(<your_lib> KEYWORD <dependencies>)声明依赖项。此类行不仅将在列出的依赖项上建立<you_lib>链接,还将继承其使用要求(通常,公共包括目录(和订单CMAKE在<your_lib>之前构建依赖库。

它的优点在于,即使SOMELIB不遵循现代CMake的想法(不声明构建/使用要求(,您仍然应该能够使用这条线。

[1] 我以为CMAKE目标与输出库名称相同,但不是强制性的。对于OP的情况,事实证明静态库目标与-static相当,因此他必须编写SOMELIB-static SOMELIBmain-static

[2] 不幸的是,对于Windows(dlls(上的共享库

[3] 我将从此博客入口开始:https://pabloariasal.github.io/2018/02/19/its time-time-tim-to-do-do-cmake-right/