将库链接为针对所有目标的最后一个库

Link a library as last against all targets

本文关键字:目标 最后一个 链接      更新时间:2023-10-16

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

cmake有没有一种方法可以将库附加到我项目的每个二进制目标,而不必编辑每个CMakeLists.txt

我在这里发现了一个类似的问题:将库链接到cmake项目中的所有目标,但它并没有得到回答。有人建议使用宏来克服这个问题,但没有解释如何实现。

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

这个变量有几个方面:

  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)

你好.cpp

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

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

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

更新

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

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

有了这样的前缀,gcc将使用其完整路径将可执行文件与给定库链接起来,因此该可执行文件将在没有额外RPATH设置的情况下工作。