CMake で静的ライブラリと動的ライブラリを同時に作るのは可能だが、手間がかかる2021年05月31日 09時28分38秒

ここらへんが CMake は C/C++ 特化のビルドシステム。CMake で動的ライブラリと静的ライブラリを同時に作ろうとすると面倒臭い。しかし、可能ではある。

CMake 2.8.8 から登場した object library を使うと、若干簡略化できる。また、-fPIC を明示的に有効にする必要がある。PIC のオプションはライブラリ毎でも出来るが、ここでは全体指定をして、全て PIC でコンパイルをしている。

% cat CMakeLists.txt
project(deal_library)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

add_library(obj_lib OBJECT a.c b.c)

add_library(alpha_shared SHARED $<TARGET_OBJECTS:obj_lib>)
add_library(alpha_static STATIC $<TARGET_OBJECTS:obj_lib>)
また、ライブラリには静的ライブラリと動的ライブラリに別の名前を付けなければならない。静的ライブラリは .a で動的ライブラリは .so で終るので、名前の衝突は起きないのだが、これは CMake のライブラリの処理の制限。TARGET_OBJECT を用いて、オブジェクトファイル名を取得する。

なお、これを cmake --build 処理した後には、libalpha_shared.so と libalpha_static. が生成される。

前回