mingw dll msvc

迷南。 2022-04-08 08:52 278阅读 0赞
  1. linux 和 windows 对动态库的编译连接方式不同

linux: 编译时直接去连接动态库

windows: 编译时不是连接动态库,而是连接.LIB文件,而这个.LIB文件其实只是从动态库中导出的符号表

(个人感觉windows真是多此一举,既然动态库中什么信息都有,为什么不直接连接动态库呢)

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MinGW下创建DLL

    在许多情况下使用DLL是一个糟糕的主意,但对于新手来说学会如何创建DLL,尤其是一个免费的开发环境例如MinGW将意味着对开发工具的快速熟悉并能了解那些看起来隐含的选项。

    相关 mingw dll msvc

    1. linux 和 windows 对动态库的编译连接方式不同 linux: 编译时直接去连接动态库 windows: 编译时不是连接动态库,而是连接.LIB文件,而这个