163

同じソース、すべて、静的バージョンと共有バージョンの両方が必要です。やりやすい?

4

6 に答える 6

140

はい、適度に簡単です。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.alibMyLib.so):

set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)

ただし、ライブラリの静的バージョンと動的バージョンの両方に同じ名前を付けることはお勧めしません。ライブラリにリンクするツールのコンパイル ラインで、静的リンケージと動的リンケージを簡単に選択できるように、別の名前を使用することを好みます。通常、libMyLib.so(共有) やlibMyLib_static.a(静的) などの名前を選択します。(これらは Linux での名前になります。)

于 2010-01-28T03:42:43.507 に答える
28

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します。

于 2013-08-31T18:03:24.980 に答える
-3

それは確かに可能です。@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 の場合) の両方を取得します。

于 2017-01-11T08:14:01.787 に答える