MinGW gcc 生成动态链接库 dll 的一些问题汇总 (补充)

时间:2021-07-16 15:50:17
我曾经写过一个小短文,介绍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