对tcmalloc公共API的未定义引用

undefine reference to tcmalloc public API

本文关键字:未定义 引用 API tcmalloc 公共      更新时间:2023-10-16

我已经克隆了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或类似的东西)。