Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:将第三方库链接到项目库 我目前正在使用CMASE作为其构建系统的C++项目。_C++_Cmake_Static Libraries - Fatal编程技术网

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)