当前位置:  开发笔记 > 编程语言 > 正文

最后针对所有目标链接库

如何解决《最后针对所有目标链接库》经验,为你挑选了1个好方法。

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

cmake是否可以通过一种方法将库附加到项目的每个二进制目标中,而无需编辑每个目标CMakeLists.txt

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



1> Tsyvarev..:

正如@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

#include 
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:)

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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有