オブジェクトファイル(lib*.o
)をビルドするときに、.cファイルの特定の機能のみを公開するにはコンパイラ(gcc/mingw32)に指示する方法はありますか?
私がこれをやりたい理由は、静的に100,000以上のライブラリ(SQLite)にリンクしていますが、それが提供する機能のうちのいくつかを選択して使用しているということです。私はコンパイラにこれらの関数を公開するように指示することができれば、選択した数少ない関数では必要のない関数のコードをすべて最適化し、ライブラリのサイズを劇的に縮小することを期待しています。静的ライブラリ "interface"
4
A
答えて
1
私はいくつかの可能な解決策を見つけた:
これは私がについて尋ねたものです。これは、Windowsのdllexpoort
のgccのと同等です:
- http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Code-Gen-Options.html(
-fvisibility
) - http://gcc.gnu.org/wiki/Visibility
私もリンク時のコード生成を発見しました。これにより、リンカーはコードのどの部分が実際に使用されているかを確認し、残りの部分を取り除くことができます。これをstrip
と-fwhole-program
と一緒に使用すると、大幅に改善された結果が得られました。
- http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Optimize-Options.html(
-flto
と-fwhole-program
を参照)
注:あなたは私が作って(何をしていたかであるGCCへの1つの呼び出し、全体のプログラムをコンパイルしていない場合このフラグは理にかなっていますsqlite.oファイルを作成し、静的にリンクします)。
私が見つかりましたが、まだここで言及されるに見ていない第三の選択肢:
-
私は `.so`ファイルではなく、DLLを使用しています
- How to remove unused C/C++ symbols with GCC and ld?
0
それはおそらくリンカーの仕事であり、コンパイラではありません。これをプログラム(.exe)としてリンクするとき、リンカは関連するシンボルのインポートだけを処理し、DLLをリンクするときは、__dllexportメカニズムがおそらくあなたが探しているものであるか、またはldのいくつかのフラグがあなたを助けますld)。
関連する問題
- 1. 静的ライブラリ内の静的ライブラリ
- 2. 静的ライブラリの静的メンバー
- 3. iPhone静的ライブラリ
- 4. アンドロイドビルド静的ライブラリ
- 5. 他の静的ライブラリにリンクする静的ライブラリに動的ライブラリをリンクする
- 6. Interface Builderは静的ライブラリのクラスを見ることができません
- 7. 静的ライブラリと動的ライブラリ - more C++ fun
- 8. リンカエラー静的ライブラリと
- 9. Objective-C静的ライブラリ
- 10. デバッグリンカエラー - SDL静的ライブラリ
- 11. バインディングC++静的ライブラリ
- 12. 静的ライブラリ、Windowsプラットフォーム上の静的ライブラリについて
- 13. XCodeで静的ライブラリの静的ライブラリを作成する
- 14. 静的ライブラリのシム関数
- 15. ブースト - 「静的」vs「共有」ライブラリ
- 16. ベンダーフレームワーク内の静的ライブラリ
- 17. C静的ライブラリのラッパー
- 18. 静的ライブラリと定数
- 19. 静的ライブラリのBoost.Testテスト
- 20. LD:STD Cの静的ライブラリ
- 21. 静的ライブラリの使用
- 22. Android NDKと静的ライブラリ
- 23. Qt:ライブラリの静的リンク
- 24. 静的クラスメンバーの共有ライブラリ
- 25. 静的ライブラリを結合
- 26. ココアタッチ静的ライブラリ - 標準フレームワーク
- 27. iOS上のWebrtc静的ライブラリ
- 28. コンパイラリンク独立静的/動的ライブラリ
- 29. 共有オブジェクト内の静的ライブラリの静的関数
- 30. 共有ライブラリと静的ライブラリの技術的な違いは?
。ソースがコンパイルされると、リンカはどのパーツが必要かを知ることができず、すべてをインポートする必要があります。 – baruch