2012-03-06 4 views
4

Googleのperftools -lprofilerで正しくリンクするために、Ubuntu 11.10でgccを取得できません。 リンカーがプログラムで直接使用されていないライブラリを破棄することが問題のようです。Ubuntu 11.10リンクperftoolsライブラリ

例が役立ちます。 、私が実行します

linux-vdso.so.1 => (0x00007fff5a9ff000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f32bc1c9000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f32bc593000) 

通常:使用

#include <math.h> 

int main() 
{ 
    double value; 
    for (int i=0; i < 1000000; i++) 
    { 
    for (int j=0; j < 1000; j++) 
     value = sqrt(100.9); 
    } 

    return 0; 
} 

コンパイル:LDDの./mainを使用して

g++ -c main.cpp -o main.o 
g++ main.o -o main -lm -lprofiler 

チェックの実行を

のは、このmain.cppにを呼ぶことにしましょう:

CPUPROFILE=/tmp/profile ./main 
01プロファイル出力を生成するために

しかし、プロファイルライブラリはリンクされていないため、プロファイルが出力されません。

プロファイラライブラリが検索パスに含まれていることを確認し、共有ライブラリと静的ライブラリを直接リンクしようとしました。私はこのようなProfilerStart()とProfilerStop(AS(プロファイラを使用して関数呼び出しを含む一旦

上記試験は、16

またUbuntuの10.04は、Ubuntu 10.10、Ubuntuの11.04、SUSE 12.1、とFedora上で正常に動作します))、プロファイラライブラリは実行可能ファイルにリンクされます。

gccをプロファイラライブラリにリンクさせる方法に関するアイデアはありますか?

ありがとうございました。コメントanother.anon.cowardとして

+0

perftoolsについてはあまり知られていませんが、その中で関数を呼び出さないとどのように役立つのでしょうか?コードがリンクされているが呼び出されていないか、まったくリンクされていない場合、違いは何ですか? –

+1

'g ++ main.o -o main -Wl、-no-as-needed -lm -lprofiler'と' ldd'をチェックしてみてください。 –

答えて

4
g++ main.o -o main -lm -lprofiler 

、あなたはおそらく--as-neededリンカフラグを使用してg++の犠牲になっています。代わりにこれを試してみてください:

g++ main.o -Wl,--no-as-needed -lprofiler -Wl,--as-needed 

注:

  1. g++はすでに再び
  2. それを追加する必要が背面に--as-neededをオンにすることは重要ではありません、-lmを追加します。そうしないと、本当に必要のない追加ライブラリにリンクする可能性があります。私の場合は
3

、問題はlibprofiler.so.0、および/usr/lib/で無libprofiler.soがあったということでした。

[email protected]:/usr/include$ dpkg -L libgoogle-perftools4 
/. 
/usr 
/usr/share 
/usr/share/doc 
/usr/share/doc/libgoogle-perftools4 
/usr/share/doc/libgoogle-perftools4/README.Debian 
/usr/share/doc/libgoogle-perftools4/copyright 
/usr/lib 
/usr/lib/libprofiler.so.0.4.5 
/usr/lib/libtcmalloc.so.4.2.6 
/usr/lib/libtcmalloc_debug.so.4.2.6 
/usr/lib/libtcmalloc_and_profiler.so.4.2.6 
/usr/share/doc/libgoogle-perftools4/AUTHORS 
/usr/share/doc/libgoogle-perftools4/TODO 
/usr/share/doc/libgoogle-perftools4/README.gz 
/usr/share/doc/libgoogle-perftools4/NEWS.gz 
/usr/share/doc/libgoogle-perftools4/changelog.Debian.gz 
/usr/lib/libtcmalloc.so.4 
/usr/lib/libtcmalloc_and_profiler.so.4 
/usr/lib/libprofiler.so.0 
/usr/lib/libtcmalloc_debug.so.4 

私はこれを公式の修正があるかわからないが、私は単純に作成/ usr/libにあるシンボリックリンクは、-lprofilerとなります。

あなたのMakefileを変更する気にしない場合は、代わりに-l:libprofiler.so.0代わりの-lprofilerを(余分なコロンに注意してください)(source)を指定することができます。

EDIT:説明したように.soを取得する公式の方法はlibgoogle-perftools-devパッケージをインストールすることは明らかであるhere

[email protected]:/usr/lib$ dpkg -S libprofiler.so 
libgoogle-perftools-dev: /usr/lib/libprofiler.so 
libgoogle-perftools4: /usr/lib/libprofiler.so.0.4.5 
libgoogle-perftools4: /usr/lib/libprofiler.so.0 

私はあなたが特定のlibにリンクしたい場合、あなたはlibx-devパッケージをインストールする必要があることを理解しますこれには/usr/lib/libx.soが含まれます。このファイルは、/usr/lib/libx.so.1.2のような特定のバージョンへのシンボリックリンクのみになります。リンカーに-lxを指定して/usr/lib/libx.soをリンクすると、実際には、libx.so.1のSONAME(最後のバージョン番号はとして取り除かれます)を記録することによって、リンクされている特定のバージョンのプログラムとリンクされます。したがって、後でプログラムを実行すると、動的リンカは/usr/lib/libx.so.1.2にシンボリックリンクされた/usr/lib/libx.so.1のみを検索し、/usr/lib/libx.soはないので、devパッケージは存在しない必要があります。

のでlibx-devパッケージはlibxに対するコンパイルとリンクのためである、とlibxパッケージがlibxに対するプリコンパイルされたプログラムを実行するためのものです。

関連する問題