の最低限必要なバージョンを常に指定します。cmake
cmake_minimum_required(VERSION 3.9)
プロジェクトを宣言する必要があります。cmake
それは必須であり、便利な変数を定義しますPROJECT_NAME
(PROJECT_VERSION
このPROJECT_DESCRIPTION
後者の変数にはcmake 3.9が必要です):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
新しいライブラリ ターゲットを宣言します。のご使用はお避けくださいfile(GLOB ...)
。この機能では、コンパイル プロセスを習得する必要はありません。怠惰な場合は、次の出力をコピーして貼り付けますls -1 sources/*.cpp
。
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
プロパティを設定VERSION
します (オプションですが、良い習慣です):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
SOVERSION
のメジャー番号に設定することもできますVERSION
。へのシンボリックlibmylib.so.1
リンクになりlibmylib.so.1.0.0
ます。
set_target_properties(mylib PROPERTIES SOVERSION 1)
ライブラリのパブリック API を宣言します。この API は、サードパーティ アプリケーション用にインストールされます。プロジェクト ツリーで分離することをお勧めします (include/
ディレクトリに配置するなど)。プライベート ヘッダーはインストールしないでください。ソース ファイルと共に配置することを強くお勧めします。
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
サブディレクトリで作業する場合、 のような相対パスを含めるのはあまり便利ではありません"../include/mylib.h"
。したがって、含まれるディレクトリのトップ ディレクトリを渡します。
target_include_directories(mylib PRIVATE .)
また
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
ライブラリのインストール ルールを作成します。CMAKE_INSTALL_*DIR
で定義された変数を使用することをお勧めしますGNUInstallDirs
。
include(GNUInstallDirs)
インストールするファイルを宣言します。
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
ファイルをエクスポートすることもpkg-config
できます。このファイルにより、サードパーティ アプリケーションがライブラリを簡単にインポートできるようになります。
次の名前のテンプレート ファイルを作成しますmylib.pc.in
(詳細については、 pc(5)マンページ を参照してください)。
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
で、マクロCMakeLists.txt
を展開するルールを追加します(フォームの変数を展開しないように cmake に依頼します)。@
@ONLY
${VAR}
configure_file(mylib.pc.in mylib.pc @ONLY)
最後に、生成されたファイルをインストールします。
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
cmake EXPORT
featureを使用することもできます。ただ、この機能は互換性があるだけでcmake
、使いづらいと思います。
最後に、全体CMakeLists.txt
は次のようになります。
cmake_minimum_required(VERSION 3.9)
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
include(GNUInstallDirs)
add_library(mylib SHARED src/mylib.c)
set_target_properties(mylib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER api/mylib.h)
configure_file(mylib.pc.in mylib.pc @ONLY)
target_include_directories(mylib PRIVATE .)
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
編集
コメントで述べたように、標準に準拠するには、静的ライブラリと共有ライブラリを生成できる必要があります。プロセスはもう少し複雑で、最初の質問と一致しません。しかし、それはここで大いに説明されていることに言及する価値があります。