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版本