我以前写过一个小短文,介绍MinGW gcc 生成动态链接库 dll 的一些问题。当时写的并不全面。近期又遇到写新的问题。这里记录一下,做个补充。
通常情况下,dll 中的函数假设採用 _stdcall ,则生成的dll中函数名会被修饰。
通常情况下,dll 中的函数假设採用 _stdcall ,则生成的dll中函数名会被修饰。
比方有例如以下的函数:
//dll.c
int _stdcall add(int a, int b)
{
return a + b;
}
终于 dll 文件里的函数名是 add@8
可是有时我们希望函数名不要加入这样的修饰,就像 windows api 函数那样。
假设用VS 编译器的话须要我们写个 def 文件才干实现。假设导出的函数非常多,这样是非常繁琐的。
利用 MinGW gcc 就简单的多。
以下的语句就能够实现:
gcc dll.c -shared -o dll2.dll -Wl,--kill-at,--output-def,dll2.def,--out-implib,dll2.a
这样生成的 dll2.dll 中函数名就没有多余的修饰。
这种dll怎样使用了。我们用gcc 编译时须要给链接器传个參数:
gcc -Wl,--enable-stdcall-fixup main.c dll2.a -o test.exe