2016-07-13 6 views
2

プリントミー()とgetme()私は、main関数強制使用されていない機能は、共有ライブラリに

で(テストのcppファイル)TEST.CPPにプリントミー()関数を使用

top.cppとtop.hで定義されたをエクスポートします

g++34 -c top.cpp -fPIC  
ar rcs libtop.a top.o  
g++34 -c test.cpp -fPIC 

g++34 -shared -o ltop.so -ltop -L. -fPIC 

getmeは
はそれがgetmeシンボル
を示すされていないltop.so私はnmで行うと、私はltop.so でエクスポートgetme機能を強制するにはどうすればよいltop.so

でエクスポートなっていません私はこの

注意を強制したい:ファイルのような複数の未使用の機能持つことができます - 私はそうライブラリにエクスポートするために、すべてを強制したい
getmeを()

答えて

2

は、作成するためにあなたの静的ライブラリを使用しないでください。あなたのダイナミックなもの。代わりに、直接コンポーネントオブジェクトファイルを使用します。

g++34 -shared -o ltop.so -fPIC top.o 

理由はバイナリをコンパイルするとき、あなたが-lでライブラリを指定する場合、コンパイル行で、以前からの唯一の未解決の外部シンボルがピックアップされていることです。元のオブジェクトファイルが使用できなくなっている場合、使用、youc、強制的に--whole-archiveリンカオプション代わりに:あなたのケースでは、これは何もありませんので、正確には何もlibtop.a

UPDATEからlibtop.soを作成する際にピックアップされていません

g++34 -shared -o ltop.so -fPIC -Wl,--whole-archive ./libtop.a 

または::

g++34 -shared -o ltop.so -fPIC -Wl,--whole-archive -L. -ltop 
+0

@Smeehey私は今のところ静的ライブラリしか持っていません。質問の詳細はシナリオの一例です。 –

+0

答えの更新を参照してください – Smeeheey

1

通常、それは静的ライブラリからすべて、だけではなく、未解決の外部を含めます静的ライブラリとリンクするのは、未解決シンボルを含む静的ライブラリ内のモジュールだけがリンクしてしまうことです。

getme()への未解決の参照がないので、このモジュールは静的ライブラリからリンクされません。解決策は、明示的にそれを解決しないことです。

マイナーな複雑化要因は、C++シンボル名のマングリングです。 getme()の機能のシンボル名は何ですか?

$ nm libtop.a 

top.o: 
0000000000000000 T _Z5getmei 

オクラホマので、マングルされたシンボル名は_Z5getmei次のとおりです。最も簡単な方法はnmコマンドでライブラリを見ることです。 -uリンカフラグは、リンク時に示されたシンボルへの未解決の参照が使用されるように強制します

g++ -shared -o ltop.so -L. -ltop -Wl,-u -Wl,_Z5getmei 

-uオプションのドキュメントがld manページにあります。これには共有ライブラリのモジュールが含まれます:

$ nm ltop.so | grep getme 
0000000000000680 T _Z5getmei 
+0

私はこれを行う一般的な方法を望んで、個々の関数参照を確認してからg ++コマンドで渡します。 –

+0

そのため、正確な質問をすることが非常に重要です。さもなければ、人々は本当の質問に対処しない答えを思いついて時間を無駄にするでしょう。少なくとも「共有ライブラリへのすべてのモジュールの組み込みを強制する」という質問を、少なくとも「未使用関数」の1つに過ぎないと明言しておかなければなりません。 –

+0

が質問の詳細を更新しました。これを指摘してくれてありがとうございます –

関連する問題