11

この質問のタイトルは完全にだまされていますが、その質問の回答は役に立ちません。

静的ライブラリにパックされた一連のオブジェクト ファイルがあります。

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp
% ar -rc libsome.a foo.o bar.o

オブジェクトファイルの代わりに libsome.a から libsome.so を生成したいのですが、ライブラリは本当にベアボーンです:

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a
% nm -DC libsome.so
0000xxxx A _DYNAMIC
0000xxxx A _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
0000xxxx A __bss_start
         w __cxa_finalize
0000xxxx A _edata
0000xxxx A _end
0000xxxx T _fini
0000xxxx T _init

静的ライブラリは問題ありません。少なくとも、それを実行可能ファイルに完全にリンクして、含まれている機能を実行させることができます。また、foo.o と bar.o から libsome.so を作成すれば問題ありません。

4

2 に答える 2

24

GNU リンカーを使用していると仮定すると、 --whole-archive オプションを指定して、静的アーカイブのすべてのコンテンツを取得する必要があります。これはリンカ オプションであるため、gcc にリンカに渡すように指示するには -Wl が必要です。

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a

libsome が必要とするライブラリ サポートの一部だけを必要とする、より複雑な処理を行っている場合は、libsome で使用した後にアーカイブ全体をオフにすることをお勧めします。

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a

GNU リンカーを使用していない場合は、リンカーがそれをサポートしているかどうか、およびその名前を確認する必要があります。Sun リンカーでは、 and と呼ば-z allextract-z defaultextractます。

于 2010-02-03T17:52:43.430 に答える
1

何も参照していないため、ファイルは .a ファイルから取り込まれていません。なぜ最初に .a ファイルを作成するのですか? -r オプションでリンクして .o ファイルを作成すると、うまくいきます。

于 2010-02-03T17:38:10.593 に答える