CMake:将第三方库链接到项目库 我目前正在使用CMASE作为其构建系统的C++项目。
这些项目由几个输出可执行文件组成,每个文件的自定义代码相对较少,但利用了几个常用库:CMake:将第三方库链接到项目库 我目前正在使用CMASE作为其构建系统的C++项目。,c++,cmake,static-libraries,C++,Cmake,Static Libraries,这些项目由几个输出可执行文件组成,每个文件的自定义代码相对较少,但利用了几个常用库: programX | ├── CMakeLists.txt (this contains the main executable targets) | ├── Engine │ ├── ... │ ├── CMakeLists.txt | ├── Utils │ ├── third_party (this is what I added) │ │ └── backward-cpp │ |
programX
|
├── CMakeLists.txt (this contains the main executable targets)
|
├── Engine
│ ├── ...
│ ├── CMakeLists.txt
|
├── Utils
│ ├── third_party (this is what I added)
│ │ └── backward-cpp
│ | └ CMakeLists.txt
│ ├── ...
│ └── CMakeLists.txt
|
└── etc.
该项目的主要功能包含在一个引擎库中,该库使用类似target\u link\u库(programX引擎)
的方式静态链接到主可执行文件。许多实用程序也包含在单独的Utils
库中
我在其中一个项目库中添加了一个CMake依赖项(它是stacktrace美化工具)。该项目也使用CMake构建
为了模块化,我将backwardcpp
项目作为依赖项添加到实际使用它的唯一项目库Utils
。我这样做是为了不“污染”主CMakeLists.txt
文件,而这些指令只涉及项目的一小部分
因此,我的Utils/CMakeLists.txt
如下所示:
SET(UTILS_HEADERS ...)
set(UTILS_OBJECTS Dummy.cpp ${UTILS_HEADERS})
# This is the new dependency!
add_subdirectory(third_party/backward-cpp)
SOURCE_GROUP("" FILES ${UTILS_HEADERS})
# 'BACKWARD_ENABLE' and 'add_backward' are needed for linking.
add_library(Utils ${UTILS_OBJECTS} ${BACKWARD_ENABLE})
add_backward(Utils)
但是,这样做不起作用,项目最终无法链接(未找到向后cpp
库中的符号),除非我将输出可执行文件直接链接到根CMakeLists.txt
文件中的第三方库(向后添加(MainExecutableA-Z)
)
我知道不能将静态库链接到其他静态库,但我想知道是否有一种很好的方法可以使用CMake实现静态库及其依赖项的模块化
(或者,我也可以将所有内容直接链接到主要目标,因为这总是有效的。)
更新(2017年5月22日)
我现在设法让一切正常运行,由于我得到了有用的答案,向后cpp
从“最窄的”CMakeLists.txt
文件100%控制。下面是我最后得到的Utils/CMakeLists.txt
文件(删除了不相关的部分):
阅读后,我将尝试以下内容(仅最后两行更改):
请注意,在上一条语句中,PUBLIC
负责设置include目录和链接库,当您将其他目标链接到Utils
时,在查看并阅读项目的后,我得出结论,将可执行文件链接到向后cpp的最简单方法是使用问题中提到的add_backward(target)
宏
shuld工作中的副标题“修改CMAKE_模块_路径”下描述的另一个选项也是,但我没有测试。Config模式下的find_包
将搜索名为Config.cmake
的文件,在本例中,该文件是backardconfig.cmake
,因此您不必编写任何额外的cmake模块,如FindBackward.cmake
。作为尝试,我将执行以下操作:
set(UTILS_HEADERS ...)
set(UTILS_OBJECTS Dummy.cpp ${UTILS_HEADERS})
source_group("" FILES ${UTILS_HEADERS})
add_library(Utils ${UTILS_OBJECTS})
list(APPEND CMAKE_MODULE_PATH /path/to/backward-cpp)
find_package(Backward)
target_link_libraries(Utils PUBLIC Backward::Backward)
如果我理解得很好,您成功地构建并链接了Utils静态库,但在尝试链接主可执行文件时收到链接器错误。我说的对吗?Utils库总是可以构建的。我还可以构建主可执行文件,但前提是我将它们直接与UTIL和第三方库链接。当我试图将UTIL链接到第三方库以及使用UTIL的主要可执行文件时,可传递部分是不起作用的。据我所知,静态库不会链接到其他静态库,因此在构建可执行文件时,您需要将其与所有静态库链接。谢谢您的回答!但是,使用此选项会导致target\u link\u库出现问题,因为它期望Backward::Backward
成为目标(target“Utils”链接到target“Backward::Backward”,但找不到目标。
)。然而,尝试使用自述文件中的第二种方法“修改CMAKE_模块_路径”也不起作用,因为CMAKE随后无法找到向后的包。是否有必要编写一个自定义的FindBackward.cmake
文件以放入/cmake
?如果将Backward::Backward
替换为Backward
,该怎么办?是的,在最后一行中只使用Backward
。我必须解决几个后续问题,比如链接libbfd
(对于更漂亮的堆栈跟踪是必需的)和添加编译时标志来切换向后cpp
的使用,但我成功地使它工作起来。非常感谢。我已经用我当前的CMakeLists.txt
文件更新了我的答案。
SET(UTILS_HEADERS ...)
set(UTILS_OBJECTS Dummy.cpp ${UTILS_HEADERS})
# This is the new dependency!
add_subdirectory(third_party/backward-cpp)
SOURCE_GROUP("" FILES ${UTILS_HEADERS})
add_library(Utils ${UTILS_OBJECTS})
target_link_libraries(Utils PUBLIC backward)
set(UTILS_HEADERS ...)
set(UTILS_OBJECTS Dummy.cpp ${UTILS_HEADERS})
source_group("" FILES ${UTILS_HEADERS})
add_library(Utils ${UTILS_OBJECTS})
list(APPEND CMAKE_MODULE_PATH /path/to/backward-cpp)
find_package(Backward)
target_link_libraries(Utils PUBLIC Backward::Backward)