CMake でモジュール定義ファイルを使う場合は、.def
ファイルをソースコードと同時に指定します。
#include <stdio.h>
extern "C" void hello()
{
printf("Hello\n");
}
エクスポートの設定がない場合、関数は DLL の外部から使うことができず、dumpbin
コマンドの結果にも表示されません。
> dumpbin /EXPORTS Sample.dll
Microsoft (R) COFF/PE Dumper Version 14.10.25019.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file Sample.dll
File Type: DLL
Summary
1000 .00cfg
1000 .data
1000 .idata
1000 .pdata
3000 .rdata
1000 .reloc
1000 .rsrc
8000 .text
モジュール定義ファイルを指定する
CMakeLists.txt
で次のように指定することで .def
ファイルを使うことができます。
cmake_minimum_required(VERSION 3.12)
project(Sample)
# DLL プロジェクトを作成
add_library(Sample SHARED sample.cpp sample.def)
sample.def
には以下の通り記入します。
EXPORTS
hello
こうすると hello
関数は dumpbin
コマンドの結果に表示され、DLL の外部から利用することができます。
> dumpbin /EXPORTS Sample.dll
Microsoft (R) COFF/PE Dumper Version 14.10.25019.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file Sample.dll
File Type: DLL
Section contains the following exports for Sample.dll
00000000 characteristics
5BC14729 time date stamp Sat Oct 13 10:15:21 2018
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00001190 hello
Summary
1000 .00cfg
1000 .data
1000 .idata
1000 .pdata
3000 .rdata
1000 .reloc
1000 .rsrc
8000 .text
dllexport 属性を使う
関数のエクスポートには __declspec(dllexport)
を使うこともできます。
extern "C" void __declspec(dllexport) hello()
{
printf("Hello\n");
}
参考資料
-
CMake
https://cmake.org/ -
CMake を使ったクロスプラットフォーム開発環境
https://engineering.linecorp.com/ja/blog/detail/103 -
add_library — CMake Documentation
https://cmake.org/cmake/help/latest/command/add_library.html -
dllexport, dllimport - MSDN
https://msdn.microsoft.com/ja-jp/library/3y1sfaz2.aspx -
C++のマングルとextern “C” {
https://www.wagavulin.jp/entry/2017/02/09/215036