2012-03-10 12 views
2

自分のプログラムに使用されているpthreadライブラリにいくつか修正を加えたいと思います。それで私は自分自身の修正されたpthreadライブラリにリンクしたいのです。私はglibcpthreadのソースコードを取ってそれを修正し、それを自分のプログラムに使うことができます。自分自身のpthreadライブラリにリンクするにはどうすればいいですか

通常、元のpthreadライブラリとのリンクには、-pthreadというフラグを使用します。どのようにして自分のライブラリにリンクするためにmakefileに指定するのですか?

+2

http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling – Christoph

答えて

2

-pthreadは、gcc/glibcの場合は-lpthread -D_REENTRANTに相当します。あなたは同じことができますが、別のリンク引数(-lname-of-library)で実行できます。

+1

あなたの特定のgccバージョンでこれが正しいことを確認できます。 'gcc -dumpspecs |を使う。 grep "%{pthread" '。 –

+0

本当に '-D_REENTRANT'が必要ないことが分かります。つまり、' -lname-of-library'だけで十分です。 – Christoph

4

-Lオプションを使用してカスタムlibが存在するディレクトリを指定し、-lオプションを使用してライブラリの名前を指定します。例については :

-L/root/x/mylib -lmypthread 

この場合、あなたのlibに名前が

は詳細についてはhttp://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlを参照してくださいlibmypthread.so必要があります。例えば、別の名前でライブラリをコンパイルしlibmypthread.soし、あなたのLD_LIBRARY_PATHに含まれているディレクトリのいずれかにそれを置く

export LD_LIBRARY_PATH = $(LD_LIBRARY_PATH):/root/x/mylib 
+1

'-rpath'オプションをリンカに渡すことをお勧めします。' -Wl、-rpath $ MYLIB_DIR'、私は構文が正しい場合。 –

0

を行い、あなたのプログラムを実行すると、ライブラリがロード用に発見されたことを確認するために

(または新しいディレクトリを追加する)。今すぐあなたのライブラリにリンクする-lmypthreadを使用することができます。

2

-pthreadを使用しないでください。おそらく他の(Solaris?)コンパイラとの互換性のために、文書化されていないGCCオプションです。

-D_REENTRANTの定義は、glibcでは完全に不要です。ヘッダーのどれもスレッドの安全性のためにこのマクロに依存しません。 (そのような仕組みの最後は1998年のglibcヘッダから削除されました!)-lpthreadにリンクするだけで、glibc関数をスレッドセーフモードに切り替えることができます。-lpthreadは他の答えと同じように独自のライブラリで置き換えることができます。

+0

http://gcc.gnu.org/ml/gcc/2010-05/msg00062.html – Christoph

+0

残念ながら、これは* *するべき方法ですが、gccには正しいとは限りません。理論的には、gccはPOSIXと互換性のないメモリモデルを使用しています。これにより、同期の間にアクセスを間違って移動させる最適化を実行できます。正しいメモリモデルを使用するには '-pthread'または' -std = c11'が必要です。私はそれが重要な状況に遭遇したことはありませんが、これはgccデベロッパーの態度だったgccバグトラッカーの1つのメーリングリストでスレッドを読むことを思い出してしまい、実際のバグに巻き込まれている可能性があります。 –

+0

ああ、問題は今。より大きなタイプのメモリにアクセスし、ビットフィールドに影響します。 gccは、ビットフィールド上の宣言された整数型を無視し、メモリ内のビットフィールドに隣接しているデータが非常に危険な場合には、読み込み/変更/書き込みサイクルを実行して(たとえば64ビットなどの)別のスレッド(またはシグナルハンドラ)によってアクセスされます。おそらく '-pthread'は動作を無効にし、別の' -f'オプションが存在する可能性があります。興味深いことに、これはLinux *カーネルでした*これは壊れました。 –

関連する問題