为非VC++工具包创建DLL

我们知道,使用extern “c”只是用在编写c++代码的时候,这样就告诉编译器不要对变量名或函数名进行改编,这样用c,c++或任何编程语言编写的可执行模块都可以访问该变量或函数。

问题:即使完全使用c来编程,但使用了不同厂商提供的工具包,Microsoft的c编译器也会对c函数的名称进行改编(哪怕根本没用到c++)。如果我们使用了__stdcall(WINAPI)调用约定的时候,就会发生这种情况。当使用__stdcall来导出c函数时,Microsoft的编译器会对函数名进行改编,给函数名添加下滑线前缀,一个@符号后跟作为参数传给函数字节数的后缀。如_SomeFunc@16.

__declspec(dllexport) LONG __stdcall SomeFunc(int x,int y,int dx,int dy)

为了用MS的工具包构建一个能与其他编译厂商工具包链接的DLL,我们必须告诉MS编译器不要对导出的函数名进行改编。有两种方法:

1.为项目创建一个.def文件,并在.def文件中包含EXPORTS段,例如

EXPORTS

SomeFunc

这样MS编译器解析.def文件时就会将SomeFunc导出。

2.可以在DLL的源文件中添加一行类似下面的代码:

#pragma comment(linker,"/export:SomeFunc=_SomeFunc@16")

这行代码会使得编译器产生一个链接器指示符,该指示符告诉链接器要导出一个名为SomeFunc的函数,该函数的入口点与_SomeFunc@16相同。



你可能感兴趣的:(Microsoft,dll,vc++,工具,编译器,winapi)