我在项目中添加了对gperftools的支持,以分析cpu和内存。Gperftools需要为每个二进制文件最后链接库tcmalloc 。
cmake是否可以通过一种方法将库附加到项目的每个二进制目标中,而无需编辑每个目标CMakeLists.txt
?
我在这里发现了一个类似的问题:将链接库链接到cmake项目中的所有目标,但未得到回答。建议使用宏来克服该问题,但是没有说明如何实现。
正如@Florian所建议的那样,您可以对库使用CMAKE_CXX_STANDARD_LIBRARIES变量,该变量应作为系统链接到每个目标,因此它将有效地出现在链接列表的最后。
此变量有两件事:
与CMake文档中所写的不同,变量的名称包含
前缀。
使用此变量时,需要附加库的完整路径,如果附加库不在LD_LIBRARY_PATH下,则可执行文件将无法正常工作Cannot open shared object file error
。对我来说,使用C
编译器(以及变量名称中的对应前缀)会link_directories()
有所帮助。使用C++
,只有RPATH设置有帮助。
例:
CMakeLists.txt:
# Assume path to the additional library is/ set(CMAKE_CXX_STANDARD_LIBRARIES / ) set(CMAKE_INSTALL_RPATH ) add_executable(hello hello.cpp) install(TARGETS hello DESTINATION bin)
hello.cpp:
#includeint 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:)
使用这样的前缀gcc
将使用其完整路径将可执行文件链接到给定的库,因此该可执行文件将在没有其他RPATH设置的情况下工作。