2012-04-30 6 views
1

2つのプロジェクト:静的なライブラリに加えて、 "gcc -llibnamehere"で共有ライブラリをバインドできますか?

  • ローダー、スタンドアロンの実行可能ファイル(モジュールのみをロードします)
  • 任意のモジュール、共有ライブラリ(librainbowdash.so)(多くのモジュールが存在することができる)

今モジュールは-lpthreadsにリンクされていますが、pthreadsが共有オブジェクトとしてのみバインドされていると思ういくつかの奇妙なエラーが発生し、ローダーがモジュールをロードするときにpthreadsがロードされません。 (GDBでのデバッグは不可能です、その種のエラーです)。

-lスイッチでは静的ライブラリのみが許可されていると思いますか?それは?それじゃない?

+0

これはありません。 '-l'は便利なパス検索のためだけです。 –

+0

+1 'librainbowdash.so'に+1! – Miguel

答えて

2

-lは、ライブラリ名を指定します。リンカーは、ライブラリ名を静的ライブラリまたは共有オブジェクトに変換して、必要に応じてリンクする必要があります。また、使用する共有ライブラリをロードするのはローダーの仕事です。

+0

それは私が考えたものです。静的ライブラリであることを強制する方法はありますか?私は利用可能なバージョンのlibpthreads.soがあると思います.. – imacake

+0

リンカによって異なります。 GNU ldでは、 '-l'引数の前に' -static'を使うことができます。 –

0

共有ライブラリが間違った場所にあるlpthreadを指している可能性があります。 lddツールを使用すると、たとえば、ldd libfoo.soは、そのようなリンクの問題を見つけるのに非常に効果的な方法です。

1

あなたはLDとgccのmanページを見ると、それはオプショングループ」を定義することができ、私は少し錆びたかもしれないが、それは正確な呪文はおそらく間違っている

gcc -o yourprog -Wl,-Bstatic yourprog.c -lstatic_lib -Wl,-Bdynamic -ldynamic_lib 

ようなものに行く必要があります。

経験から、静的ライブラリの完全なパスを渡すことは、上述の命題の正確な形式を理解することよりもはるかに頭痛が少ないことが分かっています。

これは、pthreadを静的にリンクすることで多くのメリットが得られるかどうかは疑問です。

私はあなたにも、同様

gcc -pthread ... 

を使用するかもしれないと思います。

simple -staticを使用すると、出力とすべての依存関係が静的になります。これはおそらくあなたが望むものではありません。