すべて同じソースで、静的バージョンと共有バージョンの両方が必要なだけです。簡単にできますか?
ベストアンサー1
CMakeバージョン2.8.8以降では、「オブジェクトライブラリ」を使用することができます。オブジェクトファイルの重複コンパイルを避けるためChristopher Bruns の 2 つのソース ファイルを持つライブラリの例を使用します。
# list of source files
set(libsrc source1.c source2.c)
# this is the "object library" target: compiles the sources only once
add_library(objlib OBJECT ${libsrc})
# shared libraries need PIC
set_property(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1)
# shared and static libraries built from the same object files
add_library(MyLib_shared SHARED $<TARGET_OBJECTS:objlib>)
add_library(MyLib_static STATIC $<TARGET_OBJECTS:objlib>)
からCMake ドキュメント:
オブジェクト ライブラリはソース ファイルをコンパイルしますが、オブジェクト ファイルをライブラリにアーカイブまたはリンクしません。代わりに、
add_library()
またはによって作成された他のターゲットは、 as source というadd_executable()
形式の式を使用してオブジェクトを参照できます$<TARGET_OBJECTS:objlib>
。ここで、 objlib はオブジェクト ライブラリ名です。
簡単に言うと、このadd_library(objlib OBJECT ${libsrc})
コマンドはCMakeにソースファイルを*.o
オブジェクトファイルにコンパイルするように指示します。このファイルのコレクションは、適切なライブラリ作成コマンドを呼び出す2つのコマンドで*.o
参照され、共有ライブラリと静的ライブラリが構築されます。$<TARGET_OBJECT:objlib>
add_library(...)
同じセットオブジェクト ファイル。ソース ファイルが多数ある場合、*.o
ファイルのコンパイルにはかなり長い時間がかかりますが、オブジェクト ライブラリを使用すると、コンパイルは 1 回だけです。
代償として、共有ライブラリでは位置独立コードが必要なため、オブジェクト ファイルを位置独立コードとしてビルドする必要があります (静的ライブラリでは関係ありません)。位置独立コードは効率が低い場合があることに注意してください。したがって、最大限のパフォーマンスを目指す場合は、静的ライブラリを選択します。さらに、静的にリンクされた実行可能ファイルを配布する方が簡単です。