• 6541阅读
  • 4回复

[原创]在隐式调用VC编译的DLL的时候出怪事了~~ [复制链接]

上一主题 下一主题
离线ffii4455
 

只看楼主 倒序阅读 楼主  发表于: 2012-03-17
大家都知道在VC下隐式调用dll 需要H文件,lib文件和dll文件。


前一段做学校的一个项目,硬件厂商给了硬件的api接口(DLL)还有vc用的H文件和lib文件。


项目是用QT写的,用QLibrary进行显示调用没有任何问题(事实上,这个项目就是这样结束的)。但是死活就是隐式调用提示连接错误。。。方法找了好久,也在论坛上提问了。就是没有结果。


当时试过的方法有:把dll后缀改成a。然后在pro文件中加LIB += -l...-L   。直接LIB +=(lib文件的绝对路径)  。LIB+= dll文件的绝对路径。
结果都是不行。
但是,昨天我在网上闲逛却解决了这个问题。
应该在pro文件中 LIB += (DLL的绝对路径) 同时还需要 INCLUDEPATH += (H文件所在的路径)  同时如果是C写的DLL,H文件中函数的声明前必须有 extern "C"  而且不能有__stdcall  。


这样,LIB文件岂不是完全没有用了?
求论坛高手指导啊~~

离线roywillow

只看该作者 1楼 发表于: 2012-03-17
我没用过vc编译器,只用过mingw,vc好像用的是.lib,mingw则是.a,但是应该差不了多少
LIBS +=可以-L -l的,-L是添加lib的搜索路径,可以用绝对路径,如果用相对路径,记得在前面加上$$PWD,这样qmake会将$$PWD展开为当前路径,最终makefile中的路径就是绝对路径;否则可能会搜索不到这个库
-l后的库名注意一下要不要用libXXX还是直接XXX,我发现我之前编译的静态库可以直接用-lXXX,而同样的库如果编译成shared,就必须写成-llibXXX
INCLUDEPATH也是一样的,如果想用相对路径,要在前面加上$$PWD
程序运行的时候记得把dll放到工作目录/程序目录/系统目录下,确保dll能找到
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线ffii4455

只看该作者 2楼 发表于: 2012-03-17
回 1楼(roywillow) 的帖子
大神啊~~还有那个__stdcall是什么呢?
离线dbzhang800

只看该作者 3楼 发表于: 2012-03-18
Re:回 1楼(roywillow) 的帖子
引用第2楼ffii4455于2012-03-17 22:51发表的 回 1楼(roywillow) 的帖子 :
大神啊~~还有那个__stdcall是什么呢?

这是调用约定,Windows的api和回调一般都是采用的该约定


#define CALLBACK __stdcall#define WINAPI __stdcall


另外:硬件厂商提供的应该都是C接口而不会是C++接口,不然,由于C++目前尚没有ABI,不同编译器(不同厂商,统一厂商的不同版本)都不能混用。

至于你这儿提到的东西,估计你用的MinGW编译器,MinGW来自于unix下的gcc。众所周知,unix下是没有导入库的概念的。故而mingw连接时,只有动态库没有导入库也没有问题。

至于你提到的先前不工作,更有可能是你的-L -l 参数写的不对。
离线ffii4455

只看该作者 4楼 发表于: 2012-03-18
回 3楼(dbzhang800) 的帖子
原来是这样~~受教了~
那 MinGW是否不支持__stdcall  
我的函数声明中一旦加了__stdcall就会链接错误。。。
快速回复
限100 字节
 
上一个 下一个