在没有declspec的情况下在MinGW / MSYS2中构建DLL(dllexport)

时间:2017-09-14 03:58:21

标签: dll mingw msys2

有没有办法在MinGW / MSYS2中使用所需的导出符号编译Windows DLL而不用_declspec(dllexport)注释源代码?

1 个答案:

答案 0 :(得分:1)

您可能已经解决了该问题,已经过去了一年,但是其他人可能有此问题,所以:

是的,在MinGW中,您不必添加declspec(dllexport),一个很好的原因可能是您只想使用其他人的库源文件而不修改/分叉它。

这里有一个示例 lib.c ,它将被编译成DLL并使用下面的Makefile导出func

int func(int A) {
    return A*2;
}

lib.h 以便在可执行文件中使用:

typedef int func_type(int A);

Makefile ,但请确保您已修复缩进:两条缩进的行需要使用制表符而不是4个空格:

all: lib.dll ex.exe

lib.dll: lib.c
    gcc -o lib.dll -shared lib.c -Wall

ex.exe: ex.c
    gcc -o ex.exe ex.c -Wall

请注意,-shared是什么,它将输出转换为有效的DLL并使其导出func

示例 ex.c 用于测试:

#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include "lib.h"
int main(void) {
    void* Lib = LoadLibraryW(L"lib.dll");
    assert(Lib);
    func_type (*func) = (func_type*)GetProcAddress(Lib, "func");
    assert(func);
    printf("%i\n", func(11)); // should output 22
    return 0;
}