常に最低限必要なバージョンを指定します 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
、@
マクロを展開するルールを追加します(@ONLY
フォームの変数を展開しないようにcmakeに依頼します${VAR}
)。
configure_file(mylib.pc.in mylib.pc @ONLY)
最後に、生成されたファイルをインストールします。
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
cmake EXPORT
機能を使用することもできます。ただし、この機能は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)