mingw dll msvc

来源:互联网 发布:中国科学院软件研究所 编辑:程序博客网 时间:2024/05/21 13:56

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内容类似如下:

   

  1. EXPORTS  
  2.     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版本

原创粉丝点击