我在项目中添加了对gperftools的支持,以分析cpu和内存。 Gperftools需要将库tcmalloc链接到每个二进制文件的最后。
cmake是否有办法将库附加到项目的每个二进制目标,而无需编辑每个CMakeLists.txt
?
我在这里发现了一个类似的问题:link library to all targets in cmake project,但没有回答。建议使用宏来克服这个问题,但没有解释如何实现这一点。
答案 0 :(得分:5)
正如@Florian建议的那样,您可以将CMAKE_CXX_STANDARD_LIBRARIES变量用于库,该变量应作为 system 链接到每个目标,因此它将有效地最后链接列表。
这个变量有几个方面:
与CMake文档中的内容不同,变量的名称包含<LANG>
前缀。
虽然使用此变量需要完整路径到其他库,但如果其他库不在 LD_LIBRARY_PATH 下,则可执行文件不能用于{{1错误。对我来说,使用Cannot open shared object file error
编译器(以及变量名称中的对应前缀),C
会有所帮助。使用link_directories()
时,只有RPATH设置有帮助。
示例:
<强>的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设置的情况下工作。