我已经克隆了google perf git树。
> ./autogen.sh
> ./configure --enable-frame-pointers --prefix=/usr/
> make
> sudo make install
以上所有步骤都是成功的。我可以在/usr/include/gperftools/tcmalloc.h etc 中看到头文件
我的程序
#include <stdio.h>
#include <gpertools/malloc_extension.h>
#include <iostream>
int main()
{
const unsigned int tcmalloc_stats_buf_len_ = 32768;
char tcmalloc_stats_buf[tcmalloc_stats_buf_len_];
MallocExtension::instance()->GetStats(tcmalloc_stats_buf,
tcmalloc_stats_buf_len_);
printf("%s ",tcmalloc_stats_buf);
fflush(stdout);
}
编译
g++ -ltcmalloc my_prog.c -o my_prog
my_prog.cc: undefine reference to MallocExtension::instance
如果我注释掉GetStats行,则编译工作正常。所以我认为它与tcmalloc链接。然而,当我尝试访问API时,它会给我一个错误。
可能是什么问题?也许有什么想法吗?
来自Aliaksey Kandratsenka
试着把-ltcmalloc移到最后。特别是在静态链接模式下,链接器仅在它所在的时间查看库对象按照命令行中给定的顺序处理它,它只提取符号当时已知需要。这并不是广为人知的"明白"关于有时需要指定libs的静态链接两次或多次。
这不应该影响动态链接,但我想我听到了一些发行版(也许是ubuntu)在链接器方面过于创新配置(和require-Wl,-no as needed或类似的东西)。