同じソース、すべて、静的バージョンと共有バージョンの両方が必要です。やりやすい?
6 に答える
はい、適度に簡単です。2 つの「add_library」コマンドを使用するだけです。
add_library(MyLib SHARED source1.c source2.c)
add_library(MyLibStatic STATIC source1.c source2.c)
ソースファイルがたくさんある場合でも、ソースのリストをCmake
変数に入れることができるので、簡単です。
Windows では、共有と静的の両方に「.lib」ファイルがあるため、おそらく各ライブラリに異なる名前を付ける必要があります。しかし、Linux と Mac では、両方のライブラリに同じ名前を付けることもできます (例:libMyLib.a
とlibMyLib.so
):
set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)
ただし、ライブラリの静的バージョンと動的バージョンの両方に同じ名前を付けることはお勧めしません。ライブラリにリンクするツールのコンパイル ラインで、静的リンケージと動的リンケージを簡単に選択できるように、別の名前を使用することを好みます。通常、libMyLib.so
(共有) やlibMyLib_static.a
(静的) などの名前を選択します。(これらは Linux での名前になります。)
ADD_LIBRARY
通常、目的のために呼び出しを複製する必要はありません。ただ利用する
$> man cmake | grep -A6 '^ *BUILD_SHARED_LIBS$'
BUILD_SHARED_LIBS
Global flag to cause add_library to create shared libraries if on.
If present and true, this will cause all libraries to be built shared unless the library was
explicitly added as a static library. This variable is often added to projects as an OPTION
so that each user of a project can decide if they want to build the project using shared or
static libraries.
ビルド中、最初に (1 つのソース外ディレクトリで) を使用し-DBUILD_SHARED_LIBS:BOOL=ON
、もう 1 つのディレクトリで使用OFF
します。
それは確かに可能です。@Christopher Bruns が回答で述べたように、2 つのバージョンのライブラリを追加する必要があります。
set(libsrc source1.c source2.c source3.c)
add_library(mylib-static STATIC ${libsrc})
add_library(mylib-shared SHARED ${libsrc})
次に、こちらで説明されているように、両方のターゲットが同じ出力名を使用し、互いのファイルを上書きしないように指定する必要があります。
SET_TARGET_PROPERTIES(mylib-static PROPERTIES OUTPUT_NAME mylib CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(mylib-shared PROPERTIES OUTPUT_NAME mylib CLEAN_DIRECT_OUTPUT 1)
このようにして、libmylib.a と libmylib.so (Linux の場合) または mylib.lib と mylib.dll (Windows の場合) の両方を取得します。