2

「MyLibA」と「MyLibB」と呼ばれる 2 つの C 共有ライブラリ プロジェクトが Eclipse にあります。

TestA.h

int Test1(void);
int Test2(void);

TestA.c

#include "TestA.h"

int Test1(void) { return 1; }
int Test2(void) { return 2; }

TestB.h

int Test(void);

TestB.c

#include "TestB.h"
#include "TestA.h"

int Test(void) { return Test1() + Test2(); }

「MyLibA」と「MyLibB」は、それぞれ「libMyLibA.so」と「libMyLibB.so」を生成します。

C 実行可能プロジェクト「MyExe」もあります。

#include "TestB.h"

int main(void)
{
    Test();
    return 0;
}

MyExe のプロパティは、"TestB.h" と "libMyLibB.so" の場所を認識できるように設定されています。「MyLibB」にもリンクしています。

「MyExe」をコンパイルすると、次のエラーと警告が表示されます。

エラー:

make: *** [MyExe] Error 1    
recipe for target `MyExe' failed

警告:

libMyLibA.so, needed by libMyLibB.so, not found (try using -rpath or -rpath-link)

「libMyLibA.so」を見つけてリンクする場所を認識できるように MyExe のプロパティを変更すると、それらは消え、MyExe はファイルをビルドしますが、これは理想的ではありません。

たとえば、他の多くの .so ファイルに依存する .so ファイルを使用している場合は、それらに手動でリンクする必要があります。

この問題を回避する方法はありますか?

4

2 に答える 2

5

-rpath オプションを使用します。

Eclipse CDT で、"MyExe" プロジェクトを右クリック -> プロパティ -> C/C++ ビルド -> 設定 -> ツール設定 -> ** C リンカー -> その他 -> その他のオプション

追加

-rpath "libMyLibA.so へのパス"

于 2012-09-13T15:35:04.163 に答える
0

Linuxでも同じことを行いました(Eclipseを使用せず、ターミナルから手動で)。正常に動作します。

すべての .so ファイルを /usr/lib の場所にコピーする必要があります。これを行うと、ライブラリ名自体を言及することで、リンクが確立されます。

gcc -fPIC -g -c -Wall A.c 
gcc -shared -Wl,-soname, -o libMyLibA.so   A.o

sudo cp libMyLibA.so /usr/lib

gcc -fPIC -g -c -Wall B.c -lMyLibA
gcc -shared -Wl,-soname, -o libMyLibB.so   B.o

sudo cp libMyLibB.so /usr/lib
gcc MyExe.c -lMyLibB -lMyLibA
于 2012-09-13T12:04:01.787 に答える