2

この質問は、コンパイルおよび動的リンク中にライブラリが検索される方法に関連しています。

この小さなプロジェクトを考えてみましょう:

  • 事業
    • リバ
      • a.hpp
      • a.cpp
    • ライブラリ
      • b.hpp
      • b.cpp
    • main.cpp

a.hpp:

int AAA();

a.cpp:

#include <b.hpp>

int AAA()
{
    return BBB();
}

b.hpp:

int BBB();

b.cpp:

int BBB()
{
    return 3;
}

main.cpp:

#include "liba/a.hpp"
#include "libb/b.hpp"

int main()
{
    AAA();
    BBB();
}

libb は以下でコンパイルされます:

cd libb; g++ -shared -o libb.so b.cpp

liba は以下でコンパイルされます:

cd liba; g++ -I../libb/ -L../libb/ -lb -shared -o liba.so -Wl,-rpath /full/path/to/project/libb/ a.cpp

main は次のようにコンパイルされます。

g++ -Lliba -la -Wl,-rpath /full/path/to/project/liba/main.cpp

コンパイルはエラーなく終了しますが、a.out を実行すると libb.so が見つかりません。

ldd 出力:

ldd ./a.out 
    linux-gate.so.1 =>  (0xffffe000)
    liba.so => /full/path/to/project/liba/liba.so (0xb780a000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb76ba000)
    libm.so.6 => /lib/libm.so.6 (0xb7692000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7672000)
    libc.so.6 => /lib/libc.so.6 (0xb750f000)
    libb.so => not found
    libb.so => /full/path/to/project/libb/libb.so (0xb750c000)
    /lib/ld-linux.so.2 (0xb780e000)

libb.so が 2 回発生することに注意してください。動的リンカがライブラリを見つけることができない場合と、ある場合があります。2 番目のケースでは、liba.so に埋め込まれた rpath を使用していると思います。

もちろん、その問題を解決する方法は複数あります (例: LD_LIBRARY_PATH、main.cpp をコンパイルするときに正しい rpath を埋め込むなど)。だ。

ここまでは、必要なライブラリーを検索するために同じ手順が使用されたと想定しました。私が見逃しているもの、または私が知らない隠された魔法はありますか? :)

(gcc 4.3.4 を搭載した SLED11 ボックスでテスト済み)。

4

1 に答える 1

0

隠された魔法はありませんが、基本的に、実行時にローダーに関数の場所を伝えることをコンパイラーに約束しましたが、そうしていません。AAA から呼び出された BBB はそこに到達する方法を知っていますが、メインから呼び出された BBB は知りません。

于 2011-09-27T16:01:22.953 に答える