gpt4 book ai didi

c++ - 最后将库链接到所有目标

转载 作者:太空狗 更新时间:2023-10-29 20:37:41 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

这个变量有几个作用:

  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(Makefile 生成器)上使用 CMake 2.8 和 3.4 进行测试。

更新:

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

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

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

关于c++ - 最后将库链接到所有目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34131414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com