1. 如何用qt在linux中編寫並使用動態鏈接庫
先寫好實現動態鏈接庫的libmy.cpp文件和libmy.h文件,如下:
// libmy.cpp
#include"libmy.h"
#include<iostream>
using namespace std;
MyLib::MyLib()
{
}
MyLib::~MyLib()
{
}
void MyLib::hello()
{
cout << "hello world~!" << endl;
}
// libmy.h文件
#ifndef LIBMY_H
#define LIBMY_H
class MyLib
{
public:
MyLib();
~MyLib();
void hello();
};
#endif /*LIBMY_H*/
然後寫好pro文件,如下:
TEMPLATE = lib
TARGET =DllTest
HEADERS += libmy.h
SOURCES += libmy.cpp
保存關閉,文件名命名為MyDll.pro
在Shell里執行qmake MyDll.pro,在沒有錯誤的情況下,然後執行make ,可以看到生成了幾個後綴名為so的文件,如下圖:
2. 怎樣解決Qt編譯出的程序運行時缺少libgcc
缺少動態鏈接庫,你的qt是動態編譯的,根據提示上你qt的安裝目錄上考到你的exe文件夾里
3. Qt下如何編譯庫
一般分為動態庫和靜態庫,方法分別如下:
一.
靜態庫的生成
1.
測試目錄:
lib
2.
源碼文件名:
mywindow.h,
mywindow.cpp
3.
編寫項目文件:
mywindow.pro
注意兩點:
TEMPLATE
=
lib
CONFIG
+=
staticlib
4.
生成Makefile:
qmake
mywindow.pro
5.
編譯生成靜態庫libmywindow.a
make
二.
靜態庫的使用
1.
測試目錄:
test
2.
將mywindow.h與libmywindow.a拷貝至test目錄下
3.
編寫main.cpp,
包含頭文件mywindow.h,
並調用MyWindow類
4.
編寫項目文件:
test.pro
注意加上庫路徑與庫文件名:
LIBS
+=
-L
./
-lmywindow
5.
生成Makefile:
qmake
test.pro
6.
編譯:
make
7.
運行:
./test
三.
動態庫的生成
動態庫編譯基本和靜態庫類似,需要將上述將要進行編譯的項目文件.pro中下面這行去掉
CONFIG
+=
staticlib
按上述操作編譯完後就可以得到以lib開頭並且.so*
結尾動態庫文件,一般有多個。
4. QT程序調用MFC的動態鏈接庫DLL
這個很難了,因為MFC有自己的初始化,這個一般是在程序啟動的時候完成的;而qt有自己的初始化,如果你強行加入MFC的初始化,應該也可以,但是麻煩而且醜陋.
建議你把Analyse模塊的邏輯抽出來,生出獨立的,不依賴於界面(無論是MFC還是QT)的純C++代碼,然後以QT為界面實現原來的邏輯,最後再跟GASOOH結合起來.
5. makefile中怎麼鏈接QT的動態庫詳細請看下面
寫法正確,只是你的LD_LIBRARY_PATH設置不對,找不到連接庫的路徑
export $LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/local/lib
類似這樣寫
6. qt動態鏈接庫建立需要包含哪些模塊
先新建一個庫項目
選擇chose進入下一下頁面,類型選擇共享庫,輸入一個名稱:我輸入的是sld
再點擊下一步到
如果這里我們需要QtGui所以也勾選上了
再點擊下一步直到完成
我們在.pro文件里加上
DESTDIR =..\MyDebug
它的意思是我們把生成的內容放到這個文件夾里,如果沒有它會自動生成
點擊項目把Shadow build 去掉勾選
設置完成後我們來實現方法測試
把sld.h修改成這樣
#ifndef SLD_H
#define SLD_H
#include "sld_global.h"
#include <QString>
class SLDSHARED_EXPORT Sld
{
public :
Sld();
QString GetStr();
};
#endif
它的.cpp
#include "sld.h"
#include <QDebug>
Sld::Sld()
{
qDebug()<<"";
}
QString Sld::GetStr()
{
return "aa";
}
我們那了一個測試方法返回aa
我們再新添加一個窗體供測試用
我給命名為MyDialog
把.h文件修改成
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
#include "sld_global.h"
namespace Ui {
class MyDialog;
}
class SLDSHARED_EXPORT MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
~MyDialog();
private:
Ui::MyDialog *ui;
};
#endif // MYDIALOG_H
,cpp
#include "mydialog.h"
#include "ui_mydialog.h"
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
}
MyDialog::~MyDialog()
{
delete ui;
}
這里什麼也沒做只是把SLDSHARED_EXPORT加上了
好了就這樣,我們構建一下就會在MyDebug文件夾里生成我們的dll
7. 怎樣在Qt中建立使用動態鏈接庫
工具/原料
安裝有Qt集成開發環境的Windows或Linux
一、建立並生成動態鏈接庫
1
首先在磁碟的某個位置建立一個名為DllDemo的文件夾。
打開QtCreator,新建工程,選擇Library,C++庫,然後就是choose。
2
然後在彈出的C++庫對話框默認類型共享庫,名稱為MyDll。路徑就是剛才建立的DllDemo文件夾。然後,一直下一步,直到點擊完成。
3
來看看程序結構,以及pro文件內容。
可以看到系統自動生成了一個mydll_global.h的文件。
pro內也自動生成了一些內容。可以看到TEMPLATE = lib,而不是平時的TEMPLATE = app。
4
再來看看mydll_global.h的內容。
可以看到系統自動定義了兩個宏。用於聲明哪些函數是需要導出的。
5
下面來給代碼添加點內容,以便於待會使用。
首先我們在mydll.h中添加幾行代碼,
注意:extern "C" MYDLLSHARED_EXPORT必須要有。
6
再來看看mydll.cpp中的實現代碼,都比較簡單。
7
代碼編寫完畢後,直接構建就行了。然後就可以看到生成的dll了。
二、測試生成的DLL
1
新建一個基於Qt的控制台應用程序,名稱為DllTest。依然放置在DllDemo的目錄下。
2
建好了以後,就可以在main.cpp寫代碼了。通過QLibrary類來載入dll。
因為要獲得類對象的實例,所以需要將mydll.h包含進來。
要注意的是,我沒有對函數是否成功獲取做檢測。
來看看代碼:
3
代碼寫完後就可以構建程序了。不過要運行程序,還需要將剛才生成的dll拷貝到程序的同級目錄。
4
在IDE中運行程序,因為生成的是debug版的程序,相關的環境變數未設置,無法獨立運行。
可以看到dll工作的很好,程序運行正常。
三、善用Assistant
1
最後來看看Assistant中關於QLibrary的描述。比較費解的是,Assistant中並沒有對創建共享庫做詳細的說明,估計是這個太簡單或資料太多了吧。
8. 如何用Qt調用matlab生成的動態庫
動態庫的生成
1>首先生成目標文件,但是此時要加編譯器選項-fpic和鏈接器選項-shared,
gcc -fpic -c add.c
gcc -fpic -c sub.c
生成中間文件add.o和sub.o
2>其次生成動態庫
gcc -shared –o libtiger.so add.o sub.o
生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程序生成可執行程序
說明:
以上兩部也可以合成一步搞定:
gcc -fpic -shared add.c sub.c -o libtiger.so
2.使用動態鏈接庫
在編譯程序時,使用動態鏈接庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行文件的時候會鏈接庫文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定動態鏈接庫的路勁,-ldtiger鏈接庫函數tiger。-ltiger是動態庫的調用規則。Linux系統下的動態庫命名方式是lib*.so,而在鏈接時表示位-l*,*是自己命名的庫名。
3>但是程序會提示如下錯誤
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
這是因為程序運行時沒有找到動態鏈接庫造成的。程序編譯時鏈接動態庫和運行時使用動態鏈接庫的概念是不同的,在運行時,程序鏈接的動態鏈接庫需要在系統目錄下才行。
4>使用以下方法可以解決此問題
a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄 /lib 下(但是,要是超級用戶才可以,因此要使用sudo哦,親)。就可以生成可執行程序了
b.第二種方法是:將動態鏈接庫的目錄放到程序搜索路徑中,可以將庫的路徑加到環境變數LD_LIBRARY_PATH中實現:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
9. Qt 在調用動態鏈接庫時涉及到類型轉換應該怎麼做
把QString轉成QByteArray,然後再將QByteArray轉換為char *(假如變數名為A)。
創建QByteArray用於接收輸出結果,先擴充足夠的空間,然後轉換成char * (假如變數名為B)。
調用Encode(A,B,A.getLength())進行轉換
把結果B轉換成QString。
10. 請哪位來解釋一下Qt靜態編譯和動態編譯的區別
靜態編譯與動態編譯的區別:
1、動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。
所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。
缺點一是哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。