Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28881
  • 博文数量: 2
  • 博客积分: 120
  • 博客等级: 入伍新兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-04 21:52
文章分类
文章存档

2007年(2)

我的朋友
最近访客

分类:

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)
{
return i-j;
}

int _stdcall __declspec(dllexport) bar(int i, int j)
{
return i-j;
}
这样生成的DLL只导出了foo和bar两个符号。

第二种方法稍微麻烦一点,但是根 据 的说法,相比前一种,它有自己的优点。示例源代码(dll.c)如下:

	int _cdecl foo(int i, int j)
{
return i-j;
}

int _stdcall bar(int i, int j)
{
return i-j;
}
生成DLL的命令如下:
	$ 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
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.
通过第二种方法,现在也理解了 dlltool的第一句话(dlltool may be used to create the files needed to build and use dynamic link libraries (DLLs).)的意义。

$Id: 070916.txt,v 1.2 2007/09/16 11:36:46 hmj Exp $

阅读(2239) | 评论(0) | 转发(0) |
0

上一篇:LaTeX with UTF-8

下一篇:没有了

给主人留下些什么吧!~~