CMake で静的ライブラリと共有ライブラリの両方を同時にビルドすることは可能ですか? 質問する

CMake で静的ライブラリと共有ライブラリの両方を同時にビルドすることは可能ですか? 質問する

すべて同じソースで、静的バージョンと共有バージョンの両方が必要なだけです。簡単にできますか?

ベストアンサー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 回だけです。

代償として、共有ライブラリでは位置独立コードが必要なため、オブジェクト ファイルを位置独立コードとしてビルドする必要があります (静的ライブラリでは関係ありません)。位置独立コードは効率が低い場合があることに注意してください。したがって、最大限のパフォーマンスを目指す場合は、静的ライブラリを選択します。さらに、静的にリンクされた実行可能ファイルを配布する方が簡単です。

おすすめ記事