MSVC、Mingw与动态链接库

时间:2021-04-21 01:56:59

MSVC、Mingw与动态链接库

调用约定与函数名
  • 采用__cdecl__stdcall调用约定的函数的内部表示都有一些命名修饰。比如在MSVC 和 MinGW GCC里,__cdecl函数有一个下划线前缀,__stdcall函数不仅有一个下划线前缀而且还跟有一个@开头的参数列表字节数后缀。所以double __cdecl sin(double)内部表示为_sindouble __stdcall sin(double)内部表示为_sin@8

Calling Convention

Internal*

MSVC DLL (w/ DEF)

MSVC DLL (dllexport)

DMC DLL

MinGW DLL

BCC DLL

__stdcall

_Function@n

Function

_Function@n

_Function@n

Function@n

Function

__cdecl

_Function

Function

Function

Function

Function

_Function

导出

在Windows下,要导出的函数前需要加

__declspec(dllexport)

__declspec(dllexport) int __cdecl add(int a, int b);相关文件
  • dll .lib .h .def
  • .dll 是主角
  • .lib 是导出库
  • .def 控制

.def 文件,可以指定序号、别名。对 stdcall 修饰的,可以导出 stdcallFunction 或 _stdcallFunction@8 两种形式

LIBRARY testdll.dll
EXPORTS
cdeclFunction @1
_stdcallFunction@8 @2
aliasName = cdeclFunction @3编译

1. 最简单形式

cl /LD 1.c /oout.dll
gcc 1.c -shared -o out.dll

2. 加上文件.def 后

cl /LD 1.c 1.def /oout.dll
gcc 1.c 1.def -shared -oout.dll

3. 链接器

msvc的link

link /out:out.dll /dll /implib:out.lib /def:1.def 1.obj

mingw的ld

--add-stdcall-alias 导出的元素中是否包含@nn
--kill-at 去除导出元素中的@nn
--out-implib <file> 生成导入库
--output-def <file> 为生成的DLL产生对应的.DEF文件

题外:和windows比起来,linux 下动态库的似乎就简单太多了

gcc -Wall -fpic -shared 1.c -o hello.so参考