zoukankan      html  css  js  c++  java
  • QT总结第3篇:如何在QT中添加.lib,.dll还有.h文件

    因为我在工作的过程中,使用的是第三方提供的库,但是如何将这些库添加到QT的工程中,是个问题,让我恼火了很久,怎么弄都是错的。

    下面,我会对这个问题,进行叙述,希望其他人第一次遇到这种问题的时候,可以轻易的解决。

    一.添加第三方的头文件

    这个问题再简单不过了,不过我还是要说下。

    首先,添加头文件  #include "ControlCAN.h"

    然后,再将这个头文件放到工程的目录下,就OK了,非常的简单

    二.添加.lib文件

    首先,将.lib文件放到对应的工程目录下(当然,放到其他路径也可以)。

               但是,仅仅做这一步是不行的,工程不会主动去包含这个.lib文件,你必须告诉他,lib文件在哪里,才可以。

    然后,在QT的工程中,你会看到一个.pro文件,比如,我的工程名为test_qt,那么我的文件就是test_qt.pro文件,在整 个QT界面的左上角,.pro文件是管理整个工程的,当要打开一个工程的时候,只要打开.pro,就可以打开整个工 程的所有东西。

            所以,我们要做的,就是在.pro文件中,加上一句话,告诉工程,.lib在哪里

    LIBS += -LE:/project/QT/usbcan_info/ -lControlCAN

    下面对这句话进行解析:

    1)+=这个符号是连接在一起的,不要自做聪明,给分开了,写成+ = ,这样就是错的!

    2)+=的左右两边可以有空格,也可以没有空格,随意的

    3)-L之后紧接着就跟着.lib文件所在的目录,比如,我的目录是在E盘下的project目录下的QT目录下的usbcan_info下,注意,是紧跟着,不要分开,分开就错啦!

    4)-l后面跟着的是.lib的文件名,注意,比如你的.lib文件时ControlCAN.lib,不要傻乎乎的写成了-lControlCAN.lib,不要带后缀,要写成-lControlCAN,同样,-l后面也没有空格

    完成以上的操作,就可以指定.lib文件了。其实说穿了很简单,就是把.lib随便放到一个目录下,然后告诉工程,你的.lib放到哪里了,叫什么名字。

    三.添加.dll文件

    一个工程编译成功后,会在工程目录下生成2个目录,一个是debug目录,一个是release目录(注意,如果一个工程刚刚新建,是没有这2二个目录的,不信的朋友可以看看)。

    其中,debug就叫做输出目录!因为工程编译后的.exe就在这个目录下。

    然后,将.dll文件放到这个目录下。OK了,妥妥的。

    下面的内容是我从其它地方复制的

    源地址:http://blog.sina.com.cn/s/blog_500bd63c01018b03.html

    对于他说的显示调用,我没用得到。

    弄过来,以后,我也可以看看~~~

    Qt 调用 DLL功能函数是本文要介绍的内容,DLL 是一个包含可由多个程序同时使用的代码和数据的库。不说这么多,先来看内容。
    声明: 事先我已经自己动手写了一个简单的DLL文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从DLL中导出了导入库(.lib)文件,dll中有两个函数,原型如下:
    1. void HelloWorld(); //函数内部调用Win32 API,功能是弹出一个helloworld提示框
    2. int add(int a,int b); //实现两个数相加,并返回结果
    下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....
    预备知识:
    1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。
    2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()
    其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)
    GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用
    FreeLibrary() 释放dll所占空间
    1、显示调用
    Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:
    1. #include <QApplication>
    2. #include <QLibrary>
    3. #include <QDebug>
    4. #include <QMessageBox>
    5. #include "dll.h" //引入头文件
    6. typedef int (*Fun)(int,int); //定义函数指针,以备调用
    7. int main(int argc,char **argv)
    8. {
    9. QApplication app(argc,argv);
    10. QLibrary mylib("myDLL.dll"); //声明所用到的dll文件
    11. int result;
    12. if (mylib.load()) //判断是否正确加载
    13. {
    14. QMessageBox::information(NULL,"OK","DLL load is OK!");
    15. Fun open=(Fun)mylib.resolve("add"); //援引 add() 函数
    16. if (open) //是否成功连接上 add() 函数
    17. {
    18. QMessageBox::information(NULL,"OK","Link to Function is OK!");
    19. result=open(5,6); //这里函数指针调用dll中的 add() 函数
    20. qDebug()<<result;
    21. }
    22. else
    23. QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
    24. }
    25. else
    26. QMessageBox::information(NULL,"NO","DLL is not loaded!");
    27. return 0; //加载失败则退出
    myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。
    2、隐式调用
    这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:
    1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,
    2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL
    -L 参数指定 .lib/.a 文件的位置
    -l 参数指定导入库文件名(不要加扩展名)
    另外,导入库文件的路径中,反斜杠用的是向右倾斜的
    3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern "C" { #include "dll.h" } )
    下面是隐式调用的实例代码:
    1. #include <QApplication>
    2. #include <QDebug>
    3. extern "C" //由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意
    4. {
    5. #include "dll.h"
    6. }
    7. int main(int argv ,char **argv)
    8. {
    9. QApplication app(argv,argv);
    10. HelloWordl(); //调用Win32 API 弹出helloworld对话框
    11. qDebug()<<add(5,6); // dll 中我自己写的一个加法函数
    12. return 0; //完成使命后,直接退出,不让它进入事件循环
    13. }
     
    还是隐式调用方便啊,直接就可以调用dll中的函数.
  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/sankye/p/5951852.html
Copyright © 2011-2022 走看看