(libsome.aからlibsome.so作成)共有ライブラリに静的ライブラリを変換します。ここで、私のシンボルですか?
-
25-09-2019 - |
質問
この質問のタイトルはで正確なデュープするしかし、その問題の答えは、私を助けていない。
私は静的ライブラリに詰めオブジェクトファイルの束を持っています:
% 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
は、静的ライブラリはokです、または少なくとも私は完璧に実行可能にリンクすることができるよ、それが含まれている機能を実行しています。私はfoo.oのとbar.oからlibsome.so作成する場合も、すべてがうまくされます。
解決
は、GNUリンカを使用していると仮定すると、あなたは、静的なアーカイブのすべての内容を取得しますように--whole・アーカイブ・オプションを指定する必要があります。それは、リンカオプションがありますので、あなたは、リンカにそれを通過するためには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のリンカでは、それが-z allextract
と-z defaultextract
と呼ばれています。
他のヒント
はあなたのファイルが.aのファイルからに引っ張られていません。なぜあなたは、最初は.aファイルを作っていますか?あなたは-rオプションでそれらをリンクすることにより、.oファイルを作成するより良い運を持っていると思います。