mingw dll msvc

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mingw是一个在Windows系统上运行的开源C/C++编译器集合,而MSVC是微软的Visual C++编译器。要使用Mingw调用MSVC编译出的DLL,需要注意以下几点: 1. 确保DLL的函数接口使用了C或者标准C++风格的导出方式,避免使用MSVC特有的扩展。 2. 确保Mingw的头文件和库文件与MSVC兼容,这样在编译时才能正确地解析和链接函数。 3. 在Mingw编译选项中,添加MSVC编译生成的DLL的导入库文件。可以使用"-l"选项指定导入库的路径和名称。比如,如果DLL的导入库文件名为"example.lib",则编译命令可以添加"-lexample"选项。 4. 在运行时,确保DLL和应用程序的运行环境相匹配,包括操作系统版本、依赖的运行库版本等。特别是,如果MSVC编译时使用了动态运行时库(如MSVCRT.dll),则需要确保系统上有正确的运行时库版本。 总的来说,Mingw可以通过正确的配置和编译选项来调用MSVC编译出的DLL,但是要注意确保导出接口的兼容性和运行时环境的一致性,以避免编译、链接和运行时的问题。 ### 回答2: Mingw是一种基于GNU工具链的开发环境,而MSVC是微软的编译器。在使用Mingw调用MSVC编译出的DLL时,需要注意一些细节。 首先,要确保DLL的导出函数采用了标准的C调用约定,即使用`extern "C"`进行声明。这是因为Mingw默认使用C调用约定,而MSVC默认使用C++调用约定。 其次,要确保使用Mingw编译器时,指定了正确的头文件路径和库文件路径。通常情况下,MSVC编译器生成的库文件的扩展名为`.lib`,而Mingw使用的是`.a`。因此在编译时要使用正确的库文件。 另外,还需要注意编译时使用相同的编译选项和标志。如果MSVC编译器使用了特定的编译选项或标志,那么在使用Mingw编译时也要保持一致,以免出现不兼容或不可预料的错误。 最后,在链接时需要确保引入了正确的库文件。MingwMSVC在库文件的命名规则上可能有一些差异,要确保使用了正确的库文件。 综上所述,要使用Mingw调用MSVC编译出的DLL,需要注意C调用约定、头文件路径、库文件路径、编译选项和标志的一致性。只有确保这些细节正确无误,才能顺利地在Mingw环境下调用MSVC编译出的DLL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值