对tcmalloc public API的undefine引用

时间:2015-11-21 20:37:59

标签: c++ malloc tcmalloc gperftools

我克隆了google-perf git tree。

> ./autogen.sh
> ./configure --enable-frame-pointers --prefix=/usr/
> make
> sudo make install

以上所有步骤都是成功的。我可以在/usr/include/gperftools/tcmalloc.h等中看到头文件

我的节目

 #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时,它会给我一个错误。

可能是什么问题?也许有任何想法?

1 个答案:

答案 0 :(得分:0)

来自Aliaksey Kandratsenka

尝试将-ltcmalloc移动到最后。特别是在静态链接模式下, 链接器 时查看库对象 按命令行给出的顺序处理它,它只拉取符号 已知当时需要 。这并不广为人知[&34]。 关于静态链接有时需要指定libs 两次或更多次。

这不应该影响动态链接,但我想我已经听过一些了 发行版(也许是ubuntu)的链接器过于富有创意 配置(并要求-Wl, - no-as-needed或类似的东西 那)。