目錄眾所周知,我們可以將c++專案中的類以及函式匯出,形成 .dll 檔案,以供其他程式使用,下面將說明qt環境下的使用方法。
首先建立共享庫,步驟如下:
下一步會出現類對話方塊等等,不用管它,直接點選建立即可,稍後再將類都刪了。
建立好以後你會發現有乙個包含global的標頭檔案,這個檔案中定義了__declspec(dllexport)、__declspec(dllimport)等,也可以刪掉(如果要按照下面的方法的話,刪掉即可)。
接下來還有重要的一步,請在.pro檔案中,加入
config += dll //即使你的**中寫成了 config += staticlib,也要改過來
接下來就開始我們具體的的建立方法吧!
按照匯出dll的的操作劃分,有兩種模式:
首先是標頭檔案內容:
標頭檔案:
在方法宣告時,前面加上__declspec(dllimport),也可用#define定義,看**:
//為了和將來用到的程式中公用乙個標頭檔案,建立dll時用到的是__declspec(dllexport),而使用dll時用到__declspec(dllimport),完全可以各自寫一下
#define testdllshared_export __declspec(dllexport)
#ifdef testdllshared_export
#else
#define testdllshared_export __declspec(dllimport)
#endif
//下面我要定義4個普通函式:
testdllshared_export int test1();
testdllshared_export int test2(void);
testdllshared_export int test3(int a);
testdllshared_export int test4(int a,int b);
然後在對應的cpp原始檔中實現test1、test2、test3、test4這幾個方法(為了簡單,我只輸出了一句話):
.cpp原始檔:
//記得加上上面的標頭檔案
//記得加上iostream標頭檔案,不然cout不能用
int test1()
以上就是普通函式建立.dll和使用.dll的方法,看起來動態呼叫是不是很麻煩?但它有許多優點(請自查),而且據說這裡的函式名可以利用.def檔案實現不改變名稱,省去好多麻煩,但是我嘗試了各種方法,如在.pro中利用def_file新增.def檔案還是不行55555,會的可以留言哦!
對於類的話,建立時:在class的後面,類名的前面加上定義的__declspec(dllexport);使用時,換成__declspec(dllimport),也可以參照前面的#define條件定義法。舉例:
#define hptickdllshared_export __declspec(dllexport)
#ifdef hptickdllshared_export
#else
#define hptickdllshared_export __declspec(dllimport)
#endif
class hptickdllshared_export hptickdll //我在這裡定義了類hptickdll
;靜態呼叫的方法和普通函式一樣,直接可以使用類及其成員函式(別忘了新增標頭檔案),就不細說了。
Qt中純C 專案發布為dll的方法(超詳細步驟)
目錄 眾所周知,我們可以將c 專案中的類以及函式匯出,形成 dll 檔案,以供其他程式使用,下面將說明qt環境下的使用方法。首先建立共享庫,步驟如下 下一步會出現類對話方塊等等,不用管它,直接點選建立即可,稍後再將類都刪了。建立好以後你會發現有乙個包含global的標頭檔案,這個檔案中定義了 dec...
C 反射呼叫dll中的方法
反射提供描述程式集 模組和型別的物件 type 型別 可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別,然後呼叫其方法或訪問器字段和屬性。如果 中使用了特性,可以利用反射來訪問它們 namespace assembly name public string assemb...
C 反射動態呼叫dll中的方法,並返回結果
最近在看工廠開發模式,發現用到了反射,之前只聽說過也沒怎麼用過 所以花了點時間重新溫習了一遍 反射的作用是動態的載入某個dll 程式集 並執行該程式集中的某個方法,並返回結果 當然也可以給該方法傳遞引數 直接上 namespace assembly name 上邊寫乙個測試類,命名空間是assemb...