Introduction
会社で自社作成のクラスを提供する話がありましたが、ソースではなく、ライブラリとして提供することになりました。
選択肢は、
- 静的ライブラリ
- 共有ライブラリ
の2択。
静的にしても良かったのですが、CMakeで共有ライブラリを作って、クラスを呼んだことがないので、共有にしてみました。
サンプルソースは下記になります
Answer
基本的に動的ライブラリを作るのは問題ありません。
CMakeLists.txtに
1 | add_library(${PROJ_NAME} SHARED ${SOURCES} ${HEADERS}) |
上記のようにSHAREDをつければ、dllまたはsoファイルが生成されます。
しかし、Windowsの場合、共有ライブラリを使用するには、libファイルが必要になります。
下記のクラスをdllにした場合、どうなるでしょう?
1 |
|
生成されたdllをDependency Walkerで見てみました。
何もエクスポートされていません。
そもそも、libファイルがないので、リンクできません。
当然、こんな状態でリンクできません。
共有ライブラリを作って、かつlibファイルを作成するには、一工夫が必要。
1 |
|
classの後に、dllexport属性を付与します。
シンボルが1つ以上エクスポートされるとlibが生成される模様。
これで、dllと一緒に、libファイルが生成されます。
また、生成されたdllも適切にシンボルをエクスポートできています。
ただし、gccの場合、デフォルトでエクスポートされます。
dllexport属性は余計でビルドエラーを生成しますので、プリプロセッサで切り分けておくと楽です。
1 |
1 |
|
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/CMake/03_CMake3