我在项目中添加了对gperftools的支持,以分析cpu和内存。Gperftools需要为每个二进制文件最后链接库tcmalloc 。
cmake是否可以通过一种方法将库附加到项目的每个二进制目标中,而无需编辑每个目标CMakeLists.txt?
我在这里发现了一个类似的问题:将链接库链接到cmake项目中的所有目标,但未得到回答。建议使用宏来克服该问题,但是没有说明如何实现。
正如@Florian所建议的那样,您可以对库使用CMAKE_CXX_STANDARD_LIBRARIES变量,该变量应作为系统链接到每个目标,因此它将有效地出现在链接列表的最后。
此变量有两件事:
与CMake文档中所写的不同,变量的名称包含<LANG>前缀。
使用此变量时,需要附加库的完整路径,如果附加库不在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)
Run Code Online (Sandbox Code Playgroud)
hello.cpp:
#include <stdlib.h>
int main(void)
{
void p = malloc(10);
if(p) free(p);
}
Run Code Online (Sandbox Code Playgroud)
假设,例如,额外的库替换malloc功能,可执行文件将使用该替换。
在Linux(Makefile生成器)上使用CMake 2.8和3.4进行了测试。
更新:
如@Falco所建议,在gcc编译器的情况下,可以使用-l:前缀指定其他库:
set(CMAKE_CXX_STANDARD_LIBRARIES -l:<full-library-path>)
Run Code Online (Sandbox Code Playgroud)
使用这样的前缀gcc将使用其完整路径将可执行文件链接到给定的库,因此该可执行文件将在没有其他RPATH设置的情况下工作。
| 归档时间: |
|
| 查看次数: |
1866 次 |
| 最近记录: |