-sectionおよびその他のパラメーターを使用してライブラリーを切り取り、それによってプログラムのサイズを縮小します

実際のプロジェクトでは、システムがロードするために使用するスペースに加えて、製品の特定の機能アプリケーションのために残されたスペースが小さいため、アプリケーションが使用するライブラリを調整する必要があります。たとえば、実際のプロジェクトでは、アプリケーションとライブラリは合計で14Mであり、最終的なカットは6〜7Mを削減するために行われます。

 スペースが限られている場合、使用されるライブラリ(サードパーティのオープンソースライブラリopensslなどによって異なります)は大きなボリュームを占有します。ダイナミックライブラリ(.so)を使用する場合、明らかに適切ではないため、静的ライブラリを使用できます( .a)、しかしこれだけでは不十分です。依存ライブラリには多くの実装された関数がありますが、アプリケーションプログラムはそれを使用しません。無駄な関数をリンクして貴重なスペースを占有しないでください。

このためには、コンパイルオプションを変更する必要があります。

(1)コンパイル時に:-ffunction-sections、-fdata-sectionsオプションを追加して、コンパイル時に各関数がセクションと見なされ、各データ(グローバル変数などを参照する必要がある)もセクション。-ffunction-sectionsオプションが追加されていない場合、デフォルトでは、各ソースファイルがセクションにリンクされているように見えます。このファイルで関数が使用されている限り、すべての関数がにリンクされます。

(2)リンクする場合は、-gc-sectionsオプションを追加します。これにより、リンクする場合、-gc-sectionsは未使用のセクションを破棄し、最終的な実行可能ファイルには使用済みの関数とデータのみが含まれます。リンクの単位は機能レベルであるため、未使用の機能は破棄できます。

私たちは、静的ライブラリに依存している場合には上記のように、コンパイルとリンクのオプションは、アプリケーションが小さくなる追加されているが、その他、シンボルテーブルをチェックした後、私たちは、ライブラリ内の一部の機能がまだ存在することがわかったので、いくつかの時間の調査の後、 、-fvisibility = hiddenを追加する場合

Linuxでは、ソースファイル内のすべての関数のデフォルトの可視性属性はpublicです。コンパイルコマンドに-fvisibility = hiddenパラメーターを追加すると、すべてのデフォルトのpublic属性がhiddenに変更されます。このとき、関数に__attribute __((visibility( "default")))パラメーターが設定されていて、特定の関数がデフォルトのpublic属性に従って処理されている場合、-fvisibility = hiddenパラメーターは機能しません。関数。したがって、-fvisibility = hiddenパラメーターを設定すると、__ attribute __((visibility( "default")))が設定された関数のみが外部に表示されるため、その効果はVisual Studioでの__declspec(dllexport)の定義と同等です。

要約すれば:

修改了CMakeLists.txt:
ADD_DEFINITIONS( "
-Wall")
ADD_DEFINITIONS( " -fPIC")ADD_DEFINITIONS( "-Wl、-Bsymbolic -lm")
ADD_DEFINITIONS( "-std = c ++ 11")
SET(CMAKE_CXX_FLAGS "-Wall -fPIC -s ​​-fvisibility = hidden -ffunction-sections -fdata-sections -Wl、-rpath-link = $(../../../ Library / ISVP_T20Z / lib)-Wl、-Bsymbolic -lm -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DISVP ")

       

おすすめ

転載: blog.csdn.net/Swallow_he/article/details/87373345