我曾经写过一个小短文,介绍MinGW gcc 生成动态链接库 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