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");
}

参考資料