【问题标题】:Link a library as last against all targets将库作为最后一个链接到所有目标
【发布时间】:2015-12-08 01:29:37
【问题描述】:

我正在我的项目中添加对 gperftools 的支持,以分析 CPU 和内存。 Gperftools 需要为每个二进制文件最后链接库 tcmalloc。

cmake 有没有办法将库附加到我项目的每个二进制目标,而无需编辑每个 CMakeLists.txt

我在这里发现了一个类似的问题:link library to all targets in cmake project,但它没有回答。建议使用宏来解决这个问题,但没有说明如何实现。

【问题讨论】:

标签: c++ cmake


【解决方案1】:

正如@Florian 所建议的,您可以使用CMAKE_CXX_STANDARD_LIBRARIES 变量作为库,该库应该作为系统链接到每个目标,因此它将在链接列表中有效地last .

这个变量有几件事:

  1. 与 CMake 文档中写的不同,变量的名称包含 <LANG> 前缀。

  2. 虽然使用此变量需要 完整路径 到附加库,但如果附加库不在 LD_LIBRARY_PATH 下,则可执行文件将无法使用 Cannot open shared object file error错误。对我来说,使用C 编译器(以及变量名称中的对应前缀),link_directories() 会有所帮助。对于C++,只有 RPATH 设置有帮助。

例子:

CMakeLists.txt

# Assume path to the additional library is <a-dir>/<a-filename>
set(CMAKE_CXX_STANDARD_LIBRARIES <a-dir>/<a-filename>)
set(CMAKE_INSTALL_RPATH <a-dir>)

add_executable(hello hello.cpp)
install(TARGETS hello DESTINATION bin)

hello.cpp

#include <stdlib.h>
int main(void)
{
    void p = malloc(10);
    if(p) free(p);
}

假设,例如,附加库替换 malloc 函数,可执行文件将使用该替换。

在 Linux(Makefile 生成器)上使用 CMake 2.8 和 3.4 进行测试。

更新

正如@Falco 所建议的,在gcc 编译器的情况下,可以使用-l: 前缀指定附加库:

set(CMAKE_CXX_STANDARD_LIBRARIES -l:<full-library-path>)

使用这样的前缀gcc 将使用其完整路径将可执行文件与给定库链接,因此可执行文件无需额外的 RPATH 设置即可工作。

【讨论】:

  • 此解决方案有效且符合我的需求。您可以通过这种方式使用它来改进它: set(CMAKE_CXX_STANDARD_LIBRARIES -l:/) "-l:" 使 gcc 链接到完整路径库,这避免了需要lib 在系统路径中或将其添加到 LD_LIBRARY_PATH
  • 感谢您的提示,我已将其添加到帖子中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多