【发布时间】:2017-09-14 03:58:20
【问题描述】:
有没有什么方法可以在 MinGW/MSYS2 中编译带有所需导出符号的 Windows DLL,而不用 _declspec(dllexport) 注释源代码?
【问题讨论】:
有没有什么方法可以在 MinGW/MSYS2 中编译带有所需导出符号的 Windows DLL,而不用 _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);
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;
}
【讨论】: