将库作为最后一个链接到所有目标

时间:2015-12-07 10:30:32

标签: c++ cmake

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

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

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

1 个答案:

答案 0 :(得分:5)

正如@Florian建议的那样,您可以将CMAKE_CXX_STANDARD_LIBRARIES变量用于库,该变量应作为 system 链接到每个目标,因此它将有效地最后链接列表。

这个变量有几个方面:

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

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

  3. 示例:

    <强>的CMakeLists.txt

    C++

    <强> HELLO.CPP

    # 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)
    

    假设,例如,附加库替换#include <stdlib.h> int main(void) { void p = malloc(10); if(p) free(p); } 函数,可执行文件将使用该替换。

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

    <强>更新

    正如@Falco所建议的那样,对于malloc编译器,可以使用gcc前缀指定附加库:

    -l:

    使用这样的前缀set(CMAKE_CXX_STANDARD_LIBRARIES -l:<full-library-path>) 将使用其完整路径将可执行文件链接到给定库,因此可执行文件将在没有其他RPATH设置的情况下工作。