• 8055阅读
  • 3回复

QT生成与读取dll [复制链接]

上一主题 下一主题
离线minghu
 
只看楼主 倒序阅读 楼主  发表于: 2010-07-16
我用QT写了一个只包含:int add(int a, int b) {return a+b;} 函数,然后生成AddDll.dll   
在创建一个工程test.pro,往.pro里增加内容:HEADERS += adddll.h   LIBS += debug\AddDll.dll 
然后在test.pro中便可直接调用add 函数了。
以上步骤是不是应该称为QT的隐式调用啊?

接着,我用visual C++同样写了一个add函数,生成的文件包含:addDll.dll,addDll.lib,addDll.h这三个文件,我用visual C++新建一个工程调用它,只需要将这三个文件拷到工程目录下,addDll.h加入头文件,addDll.lib加入资源文件,便可以直接调用add函数了。但是我用QT调用这个C++写的dll怎么都不行,不知道有哪位能指点指点,在QT中调用,关键是这个c++生成的.lib文件应该如何处理呢?
离线dbzhang800

只看该作者 1楼 发表于: 2010-07-16
1. 我想你没分清 .lib 和 .dll的关系,编译链接时 和 dll 是没有任何的关系的,你只需要 .h  和  .lib
2. 我想你第一步也没有生成 dll 文件,生成应该是 lib 文件(只不过你给它取了个.dll的后缀名)
离线paranoid
只看该作者 2楼 发表于: 2010-07-16
不同编译器产生的dll中函数导出名字是不同的,因此默认情况下不能互通。不过我们可以使用extern "C"的方式产生标准c风格的函数导出名字,这样就可以做到互联互通。具体做法为在.h中,使用extern "C" { 所有要导出的函数声明放在这里}

另外使用mingw编译的程序基本上是可以直接连dll的 LIBS += xxx.dll,尤其是直接连mingw编译出来的dll,一般都没有问题,甚至直连vc编译出来的dll貌似也没问题,当然前提是dll中的函数都是用extern "C"声明的。
而使用msvc编译的程序必须通过连接一个导入库import lib才能隐式调用dll
离线minghu
只看该作者 3楼 发表于: 2010-07-19
谢谢两位!^_^
快速回复
限100 字节
 
上一个 下一个