如何链接从cmake中的add_subdirectory创建的库
How to link a library that was created from add_subdirectory in CMake?
我正在尝试使用取决于第三方库的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位置,并针对SOMELIB
和SOMELIBmain
[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/
- Visual Studio - Cmake Project - Add NetCDF
- 在 atomic() 中 ++、add operation 和 fetch_add() 有什么区别
- wxImageList::Add()始终返回0
- 函数 C::add() 中不允许将'C *'隐式转换为'A *'
- C++有"not equal compare and exchange"或"fetch add on not equal"吗?
- gRPC trace.cc 的方法 TraceFlagList::Add(TraceFlag* flag) 使其链接列表
- 如何将用户定义的格式标志"add" basic_ostream?
- 'Cannot add two pointers'添加带有 WCHAR 的 LPCWSTR
- 在创建完整对象之前编写 if-can-add check 方法的正确方法?
- CMake add library libpq (postgreSQL) mac c++ clion
- 收到错误:C3867 '<int>Template_class::add':非标准语法;将指针指向带有模板的函数时
- 呼叫'php :: Extension :: add()没有匹配函数
- 使用intel内联汇编程序对bigint-add进行进位编码
- C++ 中头文件中的 Add 方法出错
- 二进制'+=':未找到采用类型 'Add' C++ 的全局运算符
- 如果我们使用链表数组来实现哈希表,则可以以不需要遍历的方式实现"add"。这是真的还是假的?
- 为什么 cmake 在定义 CXX 时忽略 ADD(SYSTEM) 头文件?
- "QFileSystemWatcher: failed to add paths"但仍然有效
- LNK2019反对CArray Add、GetAt、GetSize,所有包含都存在
- Add argc for Windows cmd