CMakeを利用してC++から共有ライブラリを作成する方法

作成日:

本ページではCMakeを利用してC++のソースファイルから共有ライブラリ (Linuxでは .so 、 Windowsでは .dll)を作成する方法について解説します。

方法#

add_library の引数に SHARED を渡します。

add_library(
  ${PROJECT_NAME}
  SHARED ${SOURCE_FILES})

説明#

add_library#

add_library はプロジェクトに対してライブラリを追加するコマンドです。コマンド名だけ見ると外部のライブラリを追加しそうに見えますが、プロジェクトでビルドする対象のライブラリを追加するコマンドです。

構文は以下の通りです。

add_library(<name> [STATIC | SHARED | MODULE]
        [EXCLUDE_FROM_ALL]
        [<source>...])

name にライブラリの名称を入れ、 source の個所にソースコードを指定すればよいという基本的な構造は add_executable と同じです。

ライブラリには幾つか種類があるため、注意が必要です。本コマンドで指定できるものについて以下にまとめてみました。

名前

意味

STATIC

静的ライブラリを生成する際に指定

SHARED

動的ライブラリを生成する際に指定

MODULE

実行時にリンクされるライブラリを生成する際に指定

STATIC (静的ライブラリ)#

静的ライブラリはよく *.lib という名称で作成されているファイルです。中身はオブジェクトファイルがアーカイブされたもののようです。

静的ライブラリはプログラムの生成時にリンクして利用します。そのため、プログラムをビルドする環境に該当するライブラリが存在している必要があります。

SHARED (共有ライブラリ)#

共有ライブラリは *.so*.dll といった名称で作成されているファイルです。

共有ライブラリはプログラムの生成時と、実行時に利用します。そのため、プログラムをビルドする環境側と実行する環境側に該当するライブラリが存在する必要があります。

利点として、ライブラリを同梱する必要がありません。例えばOpenCVを利用して作成されたプログラムを配布する場合、OpenCVはユーザ側で既に導入されているもので代用することができます。本体プログラムは該当ライブラリとは無関係のものとして配布できるため、ライセンスの問題などを回避できる可能性もあります。

MODULE (モジュール)#

こちらはあまり情報が見つかりませんでしたが、実行時にのみ参照されるライブラリを作成する際に利用されるようです。

マニュアルには dlopen で開くことができるようなファイルを作成する、という文があるのですが SHARED で作成したライブラリも dlopen などのライブラリを開くためのコマンドで利用することができます。

大きな違いとしては、幾つかのプラットフォームでは MODULE 形式で作成したライブラリはビルド時にリンクすることができないことがある、という点があるようです。

おそらくあまり利用する機会はないのではないかと思います。


関連する記事

C++
CMake