QT 호출 VS 생성된 DLL(헤더 없음)

9034 단어
카탈로그
1. 지식 준비
1.1QT DLL 호출을 위한 두 가지 일반적인 방법 소개
1.2 디스플레이 호출
1.3 스텔스 호출
2. QT 헤더 없는 파일의 DLL 호출(암시적 호출)
2.1 헤더 파일의 역할과lib 라이브러리 파일 및.dll 라이브러리 파일 관계
2.1.1.h .lib .dll의 역할은 다음과 같습니다.
2.2 헤더 파일의 쓰기 형식
2.3 대체.dll 헤더 파일 방법
2.4 헤드 없는 파일 호출 DLL 사례(암시적 호출)

1. 지식 준비


1.1QT DLL 호출을 위한 두 가지 일반적인 방법 소개


호출 설명: QT 호출 DLL 방법은 주로 두 가지로 나뉘는데 하나는 디스플레이 호출이고 다른 하나는 스텔스 호출이다.
성명: 사전에 나는 간단한 dll 파일 (myDLL.dll), C판 인터페이스를 직접 썼다.먼저 dll에서 가져오기 라이브러리(.lib) 파일을 내보냈습니다. dll에는 다음과 같은 두 가지 함수가 있습니다.
   void HelloWorld();//함수 내부에서 Win32 API를 호출하고 Helloworld 프롬프트 상자 int add(int a, int b)를 팝업합니다.//두 수를 더하고 결과를 되돌려줍니다

1.2 디스플레이 호출


호출에 필요한 파일을 표시합니다.h 헤더 파일,.dll 라이브러리 파일
일반적으로 Windows 다음 프로그램에서는 dll을 호출하는 절차를 세 가지 단계로 나눈다. LoadLibrary (), GetProcAdress (), FreeLibrary ()
여기서 LoadLibrary () 함수는 지정한 dll 파일을 불러와서 호출 프로그램의 메모리에 불러옵니다. (DLL에는 자신의 메모리가 없습니다!)
GetProcAddress() 함수는 호출을 위해 지정된 DLL(Dynamic Link Library)의 출력 라이브러리 함수 주소를 읽어들입니다.
FreeLibrary() dll이 차지하는 공간을 놓습니다.
호출 방법을 표시하려면 다음과 같이 하십시오.
#include 
#include 
#include 
#include 
#include "dll.h"             //     
typedef int (*Fun)(int,int); //      ,    
int main(int argc,char **argv)
{
    QApplication app(argc,argv);
    QLibrary mylib("myDLL.dll");   //      dll  
    int result;
    if (mylib.load())              //        
    {
        QMessageBox::information(NULL,"OK","DLL load is OK!");
        Fun open=(Fun)mylib.resolve("add");    //   add()   
        if (open)                  //        add()   
        {
            QMessageBox::information(NULL,"OK","Link to Function is OK!");
            result=open(5,6);      //        dll   add()   
            qDebug()<

myDLL.dll는 사용자 정의 dll 파일로 프로그램의 출력 디렉터리 (debug) 에 복사하면 호출할 수 있습니다.분명히 호출 코드의 작성량이 너무 많아서 정말 불편하다.

1.3 스텔스 호출


암시적 호출에 필요한 파일:.h 헤더 파일,.lib 라이브러리 파일 및.dll 라이브러리 파일
암시적 호출 방법:
1、우선 우리가.h와.lib/.a 파일을 프로그램의 현재 디렉터리에 복사한 다음 dll 파일을 프로그램의 출력 디렉터리에 복사합니다.
2. 다음은 프로 파일에 추가합니다.lib 파일의 위치: LIBS+= - L D:/hitempt/api/-l myDLL
- L 매개변수 지정.lib/.a 파일 위치
-l 매개 변수 가져오기 라이브러리 파일 이름 지정(확장자 제외)
또한 라이브러리 파일을 가져오는 경로에서 백슬래시는 오른쪽으로 기울어집니다.
3. 프로그램에서include 헤더 파일(내가 시험적으로 사용한 dll은 C로 썼기 때문에 extern "C"{#include "dll.h"} 를 사용해야 한다)
다음은 암시적으로 호출된 실례 코드입니다.
#include 
#include 
extern "C"    //   C  dll  , C++         extern "C" {},  
{
        #include "dll.h"
}
int main(int argv ,char **argv)
{
       QApplication app(argv,argv);
       HelloWordl();          //  Win32 API   helloworld   
       qDebug()<

 

2. QT 헤더 없는 파일의 DLL 호출(암시적 호출)


2.1 헤더 파일의 역할과lib 라이브러리 파일 및.dll 라이브러리 파일 관계


2.1.1.h .lib .dll의 역할은 다음과 같습니다.


H 파일 역할: 선언 함수 인터페이스 DLL 파일 역할은 함수 실행 코드입니다.h헤드 파일은 컴파일할 때 필수적이고lib는 링크할 때 필요하며 dll는 실행할 때 필요합니다.추가 의존항은.lib 아닙니다.DLL이 생성되면 LIB 파일도 생성됩니다.원본 코드의 컴파일과 링크를 완성하려면 헤더 파일과lib만 있으면 됩니다.만약 동적 연결된 프로그램도 실행한다면 dll만 있으면 충분하다.개발과 디버깅 단계에서는 당연히 다 있는 것이 가장 좋다.2.1.2 삼자 간의 관계는 다음과 같다. 우리가 자신의 프로그램에서 H 파일의 함수를 인용했을 때 체인은 어떤 DLL 파일을 호출해야 하는지 어떻게 알 수 있습니까?이것이 바로 LIB 파일의 역할이다. 링크가 호출하는 함수가 어느 DLL에 있는지, 함수 실행 코드가 DLL에 있는 위치를 알려주는 것이다. 이것이 바로 왜 추가 의존항이 필요한지 알려주는 것이다.LIB 파일은 다리 역할을 합니다.정적 라이브러리 파일을 생성하면 DLL이 없고 lib만 있습니다. 이 때 함수 실행 가능한 코드 부분도lib 파일에 있습니다.lib 라이브러리 파일(정적 라이브러리 & & 가져오기 라이브러리)은 현재 lib 접미사로 된 라이브러리는 두 가지가 있는데 하나는 정적 링크 라이브러리(Static Libary, 다음은 정적 라이브러리), 다른 하나는 동적 연결 라이브러리(DLL, 이하 동적 라이브러리)의 가져오기 라이브러리(Import Libary, 다음은'가져오기 라이브러리'라고 약칭)이다.정적 라이브러리는 하나 이상의 obj 파일을 포장하는 것이기 때문에 어떤 사람들은 아예 obj 파일에서lib을 생성하는 과정을 Archive, 즉 통합이라고 부른다.예를 들어 정적 라이브러리를 연결하면, 그 중 오류가 있으면, 어느 obj가 잘못되었는지 정확하게 찾을 수 있다. 즉, 정적 lib는 껍데기일 뿐이다.동적 라이브러리에는 일반적으로 대응하는 가져오기 라이브러리가 있어서 프로그램이 동적 링크 라이브러리를 정적으로 불러오기 편리하다. 그렇지 않으면 LoadLibary가 DLL 파일로 불러온 다음에 수동으로 GetProcAddress로 대응하는 함수를 얻을 수 있을 것이다.가져오는 라이브러리가 있으면 가져오는 라이브러리에 연결된 후 헤더 함수 인터페이스의 설명에 따라 함수를 호출하면 됩니다.가져오기 라이브러리와 정적 라이브러리의 차이는 매우 크다. 그들은 실질적으로 다른 것이다.정적 라이브러리 자체는 실제 실행 코드, 기호표 등을 포함하고 가져오기 라이브러리의 경우 실제 실행 코드는 동적 라이브러리에 있으며 가져오기 라이브러리는 주소 기호표 등만 포함하여 프로그램이 대응하는 함수에 대한 기본 주소 정보를 찾을 수 있도록 한다.

2.2 헤더 파일의 쓰기 형식

#ifndef WIDGET_H
#define WIDGET_H
#include 
#ifdef DLL_API
#else
#define DLL_API __declspec(dllexport)
#endif
//        ,  DLL_API            
DLL_API int addd(int a, int b);

2.3 대체.dll 헤더 파일 방법


그에 상응하는dll에 대응하는 헤더 파일이 없으면 QT 프로젝트에 성명을 쓸 수 있습니다.cpp 파일에서 dll 기능 함수를 호출하거나.cpp 파일에 대응하는 헤더 파일 중

2.4 헤드 없는 파일 호출 DLL 사례(암시적 호출)


성명: C++ 인터페이스 버전을 미리 VS로 생성했습니다.dll 및.lib (이 예제는 xmldll.dll 및 xmldll.lib)
.cpp 코드는 다음과 같습니다.
#include "stdafx.h"

#include  
//#include  
//#include 
//#include 
//#include  "cv.h" 
//#include "cxcore.h"
//#include "highgui.h"
#include 
#include 
#include 

//using namespace cv;  
using namespace std; 
__declspec(dllexport) int addd(int a,int b) //     ,   
{
int c;
c=a+b;
cout<

두 가지 기능 함수가 있습니다:addd()와opencvdll().
설정:xmldll.dll와xmldll.lib는 debug 디렉터리에 놓고 QT에서 QT 프로젝트 파일을 우클릭하고 라이브러리 -> 외부 라이브러리 -> xmldll을 추가합니다.dll.이 때 프로젝트 파일입니다.프로는 두 줄이 더 많다.
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build-test3-Desktop_Qt_5_5_0_MSVC2010_32bit-Debug/release/ -lxmldll
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build-test3-Desktop_Qt_5_5_0_MSVC2010_32bit-Debug/debug/ -lxmldll

INCLUDEPATH += $$PWD/../build-test3-Desktop_Qt_5_5_0_MSVC2010_32bit-Debug/debug
DEPENDPATH += $$PWD/../build-test3-Desktop_Qt_5_5_0_MSVC2010_32bit-Debug/debug

여기도 수동으로 추가할 수 있습니다. 추가 형식은 1.2 디스플레이 호출을 참고하십시오.다음에 헤더 파일에 함수 설명을 추가합니다. (.cpp 파일에도 쓸 수 있고,widget.h에도 쓸 수 있습니다.)
#ifndef WIDGET_H
#define WIDGET_H
#include 
#ifdef DLL_API
#else
#define DLL_API __declspec(dllexport)
#endif
//        ,  DLL_API            
DLL_API int addd(int a, int b);
DLL_API int opencv_dll();
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;


};

#endif // WIDGET_H

함수 호출(위치:widget.cpp):
#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include 


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
      ui->setupUi(this);

      qDebug()<

출력:
9
9
55

디버그 과정에서 발생한 문제 및 해결 방안:
1. 본 예제는 Opencv의 설정 문제와 관련되기 때문에 debug 디렉터리에 필요한 Opencv 라이브러리 파일을 갖추어야 합니다.
2. 오류 보고:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ..\..\..\..\opencv\modules\highgui\src\window.cpp, line 261

이 오류가 발생한 원인은 그림을 찾을 수 없다는 뜻이다.그림이 설치된 경로와 프로그램의 이름과 일치하는지 확인하십시오.그림 경로는 debug의 동급 디렉터리에 두어야 합니다.프로그램의 이름은 그림의 형식이 될 때 그림 확장자를 포함합니다.jpg일 때 그림을 1로 명명하면 됩니다.이름이 1이면jpg는 실제로는 1.jpg.jpg, 프로그램에서 그림을 찾을 수 없습니다.
참조 링크:https://blog.csdn.net/yusiguyuan/article/details/12649737
                  https://blog.csdn.net/u013015629/article/details/54405778

좋은 웹페이지 즐겨찾기