Qt에서 DLL 생성 및 사용
13759 단어 Qt
라이브러리에는 정적 링크 라이브러리 동적 연결 라이브러리(동적 마운트: 정적 바인딩과 동적 바인딩)가 포함되어 있습니다. 현재lib 접미사로 된 라이브러리는 두 가지가 있는데 하나는 정적 링크 라이브러리(Static Libary, 이하'정적 라이브러리'), 실제 코드와 기호는 동적 연결 라이브러리(DLL, 이하'동적 라이브러리')의 가져오기 라이브러리(Import Libary, 이하'가져오기 라이브러리')를 포함합니다.주소 기호표 포함.동적 링크 라이브러리의 호출 암시 연결과 표시 연결
Qt 동적 링크 라이브러리 생성 방법은 다음과 같습니다.
1 Qt의 라이브러리 사용
2 Qt를 사용하는 플러그인 클래스 QPlugin
QT 동적 링크 라이브러리를 호출하는 방법은 다음과 같습니다.
1. 명시적으로 DLL을 연결하고 DLL의 전역 함수를 호출하며 Qt의 QLibrary 방법을 사용한다.
2. DLL을 명시적으로 링크하고 DLL의 클래스 객체, 구성원 함수를 호출합니다.(대상을 통해 클래스 구성원 함수 호출 가능)
① 허함수표를 사용하는 방법, 이것도COM이 사용하는 방법으로 Qt의 QLibrary 기술을 이용하여 호출한다.
② 생성된 DLL 플러그인 클래스 객체를 Qt의 QPluginLoader 클래스로 직접 호출합니다.
3. 암시적 링크 DLL: DLL 글로벌 함수와 클래스 객체, 구성원 함수를 호출합니다.
명시적 연결
항상 Windows에서 dll을 호출하는 절차는 세 가지 단계로 나뉘는데 그것이 바로 LoadLibrary(), GetProcAdress(), FreeLibrary()이다. 그 중에서
LoadLibrary () 함수는 지정한 dll 파일을 불러와서 호출 프로그램의 메모리에 불러옵니다. (DLL에는 자신의 메모리가 없습니다!)GetProcAddress() 함수에서 지정된 동작 읽어들이기
상태 링크 라이브러리(DLL)의 출력 라이브러리 함수 주소를 호출할 수 있습니다.FreeLibrary () 는 dll이 차지하는 공간을 방출합니다.
Qt에서 DLL을 명시적으로 호출하려면 Qt의 QLibrary 방법을 사용합니다.
QLibrary 클래스 디스플레이 링크가 DLL을 호출하는 단계: load(), resolve(const char * symbol), unload()와 대응
암시적 링크
헤더 파일(.h), 가져오기 라이브러리 파일(.lib), 동적 링크 라이브러리(.dll) 등 세 개의 파일이 필요하며 다음 단계를 수행합니다.
1、우선 우리가.h와.lib/.a 파일을 프로그램의 현재 디렉터리에 복사한 다음 dll 파일을 프로그램의 출력 디렉터리에 복사합니다.
2. 다음은 프로 파일에 추가합니다.lib 파일의 위치: LIBS+= - L D:/hitempt/api/-l myDLL
- L 매개변수 지정.lib/.a 파일 위치
-l 매개 변수 가져오기 라이브러리 파일 이름 지정(확장자 제외)
또한 라이브러리 파일을 가져오는 경로에서 백슬래시는 오른쪽으로 기울어집니다.
LIBS의 용법은 LIBS + = - L 주소 - l 라이브러리 이름입니다. - L 뒤에 빈칸이 없으면 바로 주소를 추가합니다. 그리고 빈칸 - l 라이브러리 이름은 주소와 - l 라이브러리 이름 사이에 빈칸이 있습니다.
Qt의 스텔스 호출 (여기는 dll 파일을 직접 사용합니다. dll 파일은 Qt에서 생성됩니다. 만약 dll이 vs 등 다른 생성이라면 검증이 필요합니다)
INCLUDEPATH + = -l-l 매개 변수는 가져오기 라이브러리 파일 이름을 지정합니다. (확장자 없이) 필요한 헤더 파일을 원본 프로그램 디렉터리에 넣으면 이 구절이 필요하지 않습니다.
LIBS+=-l 컴파일러가 mingw인 경우 직접 추가합니다.dll 파일은 추가할 필요가 없습니다.서류
DLL(Dynamic Link Library) 생성 및 사용
1 Qt에서 C++ 라이브러리를 만들고 dll을 생성합니다.QT5 동적 링크 라이브러리의 창설과 사용
전역 함수를 호출하지 않았습니다.
위에서 연결된 코드를 이어서 전역 함수를 호출합니다.
sld.cpp에 추가
void shuchu()
{
qDebug() << " ";
}
sld.h에 추가
extern "C" SLDSHARED_EXPORT void shuchu(); //
마지막으로mainwindow에서.cpp에 추가
void MainWindow::on_pushButton_clicked()
{
···
shuchu(); // sld.dll
····
}
2 위의 스텔스 링크 프로그램을 수정하고 현식 연결의 호출을 완성하고 DLL의 전역 함수를 호출하며 Qt의 QLibrary 방법을 사용한다.
mainwindow에서.cpp에 추가#include
typedef void (*Fun)(void); //
구조 함수에 추가QLibrary mylib("sld.dll"); // dll DESTDIR =..\MyDebug dll
if (mylib.load()){ //
// shuchu()
Fun add = (Fun)mylib.resolve("shuchu");
// add()
if (add)
{
qDebug() << "Link to add Function is OK!"<
// dll add()
add();
}
}
mylib.unload(); //
DLL의 클래스 객체, 멤버 함수를 호출합니다.
a 허함수표 방법, Qlibrary 기술 호출
sld.h에 추가
virtual QString GetStr();
extern "C" SLDSHARED_EXPORT Sld* getSlddll(); // Sld
sld.cpp에 추가Sld* getSlddll()
{
return new Sld();
}
。
mainwindow.cpp
#include "../sld/sld.h" // , sld
typedef Sld* (*GetSlddll)();// , TestDLL ;
QLibrary mylib("sld.dll"); // dll DESTDIR =..\MyDebug dll
if (mylib.load()) //
{
// 、
GetSlddll getsld = (GetSlddll)mylib.resolve("getSlddll");
if(getsld)
{
qDebug() << "SLD Link to add Function is OK!"<
Sld *sld = getsld();
QMessageBox * msg=new QMessageBox(this);
msg->setText(sld->GetStr());
msg->show();
delete sld;
}
}
위의 DLL 은 Qt 에서 호출된 방법에 해당하는 코드를 만듭니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다. QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.