分类:
2007-09-16 20:17:50
关于如何在MinGW/Cygwin下面编译DLL,网络上已经有很多这种文章了。在这 里强调的是如何在DLL中只导出(export)某些指定的符号(symbol)。
默认情况下ld会在DLL中导出绝大部分的全局符号,除了一些非常特殊的符号,详 细可以参考ld的。一 般来说,有两种方法导出指定的符号:__declspec(dllexport)和module definition file(.DEF)文件。
第一种方法非常简单,只要在函数的声明中加入``__declspec(dllexport)'' 即可,如下面的代码(dll.c):
int _cdecl __declspec(dllexport) foo(int i, int j)这样生成的DLL只导出了foo和bar两个符号。
{
return i-j;
}
int _stdcall __declspec(dllexport) bar(int i, int j)
{
return i-j;
}
第二种方法稍微麻烦一点,但是根 据 的说法,相比前一种,它有自己的优点。示例源代码(dll.c)如下:
int _cdecl foo(int i, int j)生成DLL的命令如下:
{
return i-j;
}
int _stdcall bar(int i, int j)
{
return i-j;
}
$ gcc -c dll.c
$ dlltool -D dll.dll -e dll.exp -d dll.def dll.o
$ gcc -Wall -shared -o dll.dll dll.o dll.exp
以前一直没有搞清楚export file(.EXP)文件是做什么用的,也不知道为什 么需要dlltool这个工具。 事实上, 中的一句话已经把export file(.EXP)文件解释的非常清楚了,如下:
When building the DLL, the linker uses the .def file to create an通过第二种方法,现在也理解了 dlltool的第一句话(dlltool may be used to create the files needed to build and use dynamic link libraries (DLLs).)的意义。
export (.exp) file and an import library (.lib) file. The linker
then uses the export file to build the DLL file. Executables that
implicitly link to the DLL link to the import library when they
are built.
$Id: 070916.txt,v 1.2 2007/09/16 11:36:46 hmj Exp $