引用MinGW生成的.dll.a后出现的问题

以前很少调用MinGW的运行时库,现在用到一个项目,用到了glib和gettext等。
遇到了一个问题,折腾了一个下午。
gettext的运行时库之一是intl,MinGW只提供了.dll.a,于是参考了网上其它的介绍,像其它.lib一样调用

pragma comment(lib, "libintl.dll.a")

结果就出现了
无法定位程序输入点 GdiplusStartup于动态链接库libintl-8.dll上。
我坚信libintl没有用到GDI+,Depends查看dll后证明了我的观点,但是Depends查看引用它的exe,却发现exe认为GdiplusStartup在libintl.dll上。

只能证明一个问题,.dll.a和.lib不一样。

那么需要找到相应的.lib,网上有自己编glib的办法,看了看,环境搭建也比较复杂。后来想到一个问题,lib不过是dll导出库的一个说明,那么一定有办法通过dll生成lib。网上搜了后的确如此,意识到自己真的很土。
按网上说的下载pexports生成.def,然后lib命令生成dll后再导入,一切正常。

总结一下遇到的问题

  1. .dll.a,.a和.lib不一样,像libx264.a等vs可以直接导入,我遇到的这个就不可以直接导入(实际上,我的DEBUG可以正常生成和运行,RELEASE生成是没问题的,只是运行时出现上述问题,说明链接生成时是错误的,)。
  2. gettext有很多版本,网上下载一个msvc的版本可以直接用,但是要在安装机器上部署多个不同版本的.dll,会使安装包没必要的增大。
  3. dll是可以生成.lib的,以后.a还是别用了,如果官方没提供,就自己生成一个吧(.h文件没办法生成)。

转载于:https://www.cnblogs.com/sanghg/p/4433885.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSVC vs. MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -> exe gcc a.o b.o ... -o main.exe c -> dll,def,a gcc a.c -shared -o a.dll -Wl,--output-def,a.def,--out-implib,liba.a a -> dll a2dll liba.a dll -> a: dlltool --dllname a.dll --def a.def --output-lib liba.a (需要def文件) a -> def: dumpbin /exports lib.a > lib.def (在windows上调用,def需要修改) dll -> def : pexports a.dll -o > a.def (这里的-o是指给函数标序号) lib -> def : reimp -d a.lib lib -> a: (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions) MSVC: c -> lib cl /LD a.c (注意已经定义了export列表) c -> dll cl /LD a.c c -> obj cl /c a.c c -> exe cl a.c /out:a.exe dll ->lib lib /machine:ix86 /def:a.def /out:a.lib (需要def文件) obj ->lib lib a.obj b.obj... /out:mylib.lib dll ->def DUMPBIN a.dll /EXPORTS /OUT:a.def (生成的def需要做修正) lib ->def reimp -d a.lib (这个要在MSYS+MinGW下用) 关于这些工具的适用范围可以很容易的理解和记忆。 dll和exe都是PE文件,所以可以使用pexports. lib和a是静态库文件,都是归档类型,不是PE格式。所以不能使用pexports. dll可以使用dlltool. lib可以使用lib, 和reimp(lib->a工具) 所有的bin文件,包括dll,exe,lib,a都可以使用dumpbin. 参考: http://hi.baidu.com/kaien_space/blog/item/5e77fafa2ba9ff16a8d3110a.html Mingw官网文档: http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs http://oldwiki.mingw.org/index.php/CreateImportLibraries http://www.mingw.org/wiki/FAQ http://hi.baidu.com/opaquefog/blog/item/9b21b6deb324e25dccbf1ab7.html http://qzone.qq.com/blog/8330936-1238659272 http://hi.baidu.com/jzinfo/blog/item/b0aa1d308de99f9da8018e00.html 本篇测试用代码: 1. main.cpp #include #include #include "mylib.h" using namespace std; int main() { char str[]="Hello world!"; printhello(str); return 0; } 2. mylib.cpp #include #include #include "mylib.h" using namespace std; void EXPORT printhello(char *str) { cout << str << endl; } 3. mylib.h #define EXPORT __declspec(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值