在MinGW/MSYS2中构建DLL而不使用declspec(dllexport)

在MinGW/MSYS2中构建DLL而不使用declspec(dllexport),dll,mingw,msys2,Dll,Mingw,Msys2,有没有办法在MinGW/MSYS2中使用所需的导出符号编译Windows DLL,而不使用\u declspec(dllexport)注释源代码?您可能已经解决了这个问题,已经一年多了,但其他人可能有这个问题,因此: 是的,在MinGW中,您不必添加declspec(dllexport),一个很好的理由可能是您只想使用其他人的库源代码,而不需要修改/分叉它 下面是一个示例lib.c,它将被编译成DLL并使用下面的Makefile导出func: int func(int A) { retu

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

您可能已经解决了这个问题,已经一年多了,但其他人可能有这个问题,因此:

是的,在MinGW中,您不必添加
declspec(dllexport)
,一个很好的理由可能是您只想使用其他人的库源代码,而不需要修改/分叉它

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

int func(int A) {
    return A*2;
}
和一个
lib.h
用于可执行文件:

typedef int func_type(int A);
生成文件
,但请确保修复缩进:两个缩进行需要一个制表符,而不是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;
}
#包括
#包括
#包括
#包括“lib.h”
内部主(空){
void*Lib=LoadLibraryW(L“Lib.dll”);
断言(Lib);
func_type(*func)=(func_type*)GetProcAddress(Lib,“func”);
断言(func);
printf(“%i\n”,func(11));//应输出22
返回0;
}

谢谢你的回答。老实说,我不记得我做了什么,所以我无法记分,但你可以投赞成票。