動態鏈結庫中匯出模板函式

2021-09-07 13:23:13 字數 1240 閱讀 8016

c++ 支援函式模板。利用函式模板,能夠簡化我們的程式**。我在自己的**中也經經常使用到函式模板,可是曾經一直以為函式模板是要放到標頭檔案裡的,否則呼叫模板函式時,編譯器會找不到函式模板的定義。今天閒暇,又翻了翻 c++ primer。發現我曾經的理解是有問題的。模板函式也能夠像普通函式那樣。將宣告放在標頭檔案裡。定義放在.cpp 中。這時又想到還有乙個問題,dll 中能否夠匯出模板函式呢。

假設能夠的話,就能夠將函式的實現**真正隱藏起來了。經過一番實驗,發現是能夠的,可是有一些限制。

比方有例如以下的函式:

template>

type

max(type a, type b)

直接寫成以下的樣子是不行的。

template> __declspec(dllexport) type

max(type a, type b)

由於 dll 中想要匯出乙個函式。必需要生成這個函式的實體。

而普通的函式模板在例項化之前是沒有實體的。既然沒有例項化,我們就人為的例項化它。比方以下這樣:

template

type max(type a, type b)

template __declspec(dllexport) int max(int a, int b);

template __declspec(dllexport) char max(char a, char b);

template __declspec(dllexport) short max(short a, short b);

再次編譯。就成功的匯出了三個 max 函式。

可是這裡要注意,剛開始時我寫成了這個樣子:

template

type max(type a, type b)

template

__declspec(dllexport) int max(int a, int b);

template

__declspec(dllexport) char max(char a, char b);

template

__declspec(dllexport) short max(short a, short b);

結果乙個函式也沒匯出來。不知這是 vc2010 的bug 還是特意這麼設計的。

手裡沒有其它的c++ 編譯器,不知其它的 c++ 編譯器上結果怎樣。

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...