0

google-perf git ツリーのクローンを作成しました。

> ./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 にアクセスしようとすると、エラーが発生します。

何が問題なのですか?おそらく何かアイデアはありますか?

4

1 に答える 1

0

Aliaksey Kandratsenka から

-ltcmalloc を最後に移動してみてください。特に静的リンク モードでは、リンカーは、コマンド ラインで指定された順序でライブラリ オブジェクトを処理するときにのみライブラリ オブジェクトを参照し、その時点で必要であることがわかっているシンボルのみをプルします。これは、libs を 2 回以上指定する必要がある場合がある静的リンクに関する「落とし穴」として広く知られていません。

これは動的リンクに影響を与えるべきではありませんが、一部のディストリビューション (おそらく ubuntu) がリンカー構成で過度に創造的であると聞いたことがあると思います (必要に応じて -Wl,--no-as-needed などが必要です)。

于 2015-11-21T22:12:45.563 に答える