您的位置:首页 > 其它

mingw dll msvc

2011-04-13 17:35 239 查看
1. linux 和 windows 对动态库的编译连接方式不同

linux: 编译时直接去连接动态库
windows: 编译时不是连接动态库,而是连接.LIB文件,而这个.LIB文件其实只是从动态库中导出的符号表
(个人感觉windows真是多此一举,既然动态库中什么信息都有,为什么不直接连接动态库呢)

2. 跨平台编译器: mingw, cygwin

偏好mingw, 虽然不能直接支持posix,但已经有第三方的posix库了,很方便。

3. 用mingw编译dll, lib文件

dll: 用标准的gnu动态库编译方法即可,例:"gcc -shared -o hello.dll hello.c"
lib: 首先说明,用mingw生成的lib在windows下可用,但是对于VC,呵呵,不能用(windows封闭,VC更封闭,微软在搞什么啊)
(1) mingw 生成 lib文件
a) 首先用mingw自带的dlltool生成要导出的符号定义文件,如:
dlltool -z hello.def --export-all-symbols hello.o
b) 再用dlltool从动态库中导出.lib文件,如:
dlltool -k --dllname hello.dll --output-lib hello.lib --def hello.def
(2) 如何生成VC用的lib
用mingw编译出的dll库VC是可以直接用的,但是lib不行。需要调整.def和.lib的生成方法
a) .def
用上文提到的"dlltool -z hello.def --export-all-symbols hello.o",生成的.def内容类似如下:
EXPORTS
hello @ 1


问题就在于函数符号后面的"@ n",如果带上这个东西,在VC调用库时会出现乱序,明明调用的是函数A,
结果却进入了函数B中,原因不明,反正把这个东西去掉就行了。可以用sed命令来去除:
sed 's/ @ [0-9]*//g' hello.def
b) .lib
必须用VC自带的"lib"工具来生成,使用时将上面生成的.dll和.def文件放在相同的目录下,然后在命令行下执行
lib /machine:i386 /def:hello.def
就会生成对应的hello.lib,大功告成,VC可以编译连接lib了

例子程序:http://download.csdn.net/source/3187967

其中Makefile编译常规的Linux版本, Makefile.mingw使用mingw工具链编译windows版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: