将库链接为针对所有目标的最后一个库
Link a library as last against all targets
我在项目中添加了对gperftools的支持,以评测cpu和内存。Gperftools需要将库tcmalloc链接到每个二进制文件的最后一个。
cmake有没有一种方法可以将库附加到我项目的每个二进制目标,而不必编辑每个CMakeLists.txt
?
我在这里发现了一个类似的问题:将库链接到cmake项目中的所有目标,但它并没有得到回答。有人建议使用宏来克服这个问题,但没有解释如何实现。
正如@Florian所建议的,您可以为库使用CMAKE_CXX_STANDARD_BRARIES变量,该变量应该作为系统链接到每个目标,因此它将有效地成为链接列表中的最后一个。
这个变量有几个方面:
-
与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)
你好.cpp:
#include <stdlib.h>
int main(void)
{
void p = malloc(10);
if(p) free(p);
}
例如,假设该附加库替换了malloc
函数,可执行文件将使用该替换。
在Linux上用CMake 2.8和3.4进行了测试(Makefile生成器)。
更新:
根据@Falco的建议,在gcc
编译器的情况下,可以使用-l:
前缀指定附加库:
set(CMAKE_CXX_STANDARD_LIBRARIES -l:<full-library-path>)
有了这样的前缀,gcc
将使用其完整路径将可执行文件与给定库链接起来,因此该可执行文件将在没有额外RPATH设置的情况下工作。
- lower_bound()返回最后一个元素
- 获取向量C++中第一个值和最后一个值的和
- 获取用C/C++打印的最后一个字符串
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 为什么我的最后一个 ELSE 条件无法正确执行
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 仅显示链表的最后一个元素
- 测试迭代器是否位于列表中的最后一个
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 反转后不返回最后一个元素
- 如何删除矢量中的重复值,最后一个除外
- 如何在写入文件时擦除最后一个逗号
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 在 QListView 中显示最后一个元素
- 将库链接为针对所有目标的最后一个库