关于模板函数/模板类编译成DLL
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                关于模板函数/模板类编译成DLL
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                ]關(guān)于模板函數(shù)/模板類編譯成DLL
Posted on 2011-08-16 08:48 單魚游弋 閱讀( 353) 評(píng)論( 0) 編輯 收藏要編譯成DLL,就要聲明和實(shí)現(xiàn)分開。
首先文件組織是這樣的(為了簡化,沒有加上編譯成DLL的語句) 在 T.h 中(聲明模板函數(shù)) template<typename T> T Max(T& t1,T& t2); 在 T.cpp 中(模板函數(shù)的實(shí)現(xiàn)) #include"T.h" template<typename T> T Max(T& t1,T& t2) { ? return t1>t2?t1:t2; } 編譯 T.cpp 很好,通過編譯 在 Main.cpp 中(用于測試的) #include<iostream> using namespace std; #include"T.h" int main() { ? int a=3,b=4; cout<<Max(a,b)<<endl; ? double c=5.6,d=4.8; cout<<Max(c,d)<<endl; system("pause"); ? return 0; }? 編譯 Main.cpp 很好,也通過編譯 然后 鏈接運(yùn)行程序 此時(shí),產(chǎn)生鏈接錯(cuò)誤了(Visual Studio 2008環(huán)境下) 1>Main.obj : error LNK2019: 無法解析的外部符號(hào) "double __cdecl Max<double>(double &,double &)" (??$Max@N@@YANAAN0@Z),該符號(hào)在函數(shù) _main 中被引用 1>Main.obj : error LNK2019: 無法解析的外部符號(hào) "int __cdecl Max<int>(int &,int &)" (??$Max@H@@YAHAAH0@Z),該符號(hào)在函數(shù) _main 中被引用 鏈接器根本沒有找到那兩個(gè)函數(shù) 發(fā)現(xiàn)模板的東西分開成 .h 和 .cpp 是不行的 因?yàn)槟?span style="color:#ff0000">板是需要在編譯時(shí)實(shí)現(xiàn)特例化的,光編譯T.cpp是沒有產(chǎn)生可用的函數(shù)的。 因此,模板函數(shù)/模板類也無法編譯成DLL Visual Studio 中的系統(tǒng)庫中的STL(標(biāo)準(zhǔn)模板庫)都是以源代碼的形式呈現(xiàn)的(例如<map>里面可以看到源碼的) 看來微軟也沒得好辦法解決這個(gè) 所以一般而言 模板的東西 還是都直接寫到 .h 就好了 至于說一定要分開成 .h 和 .cpp的話,用的時(shí)候需要#include".cpp"(這個(gè)方法很畸形,本質(zhì)還是直接include了聲明和實(shí)現(xiàn),據(jù)說gcc可以分開成 .h 和 .cpp,沒有測試過,應(yīng)該只是編譯器自動(dòng)化的幫你include了) 當(dāng)然這樣還是不能編譯成DLL的,我查閱了一下,實(shí)在想編譯成DLL的話,必須在編譯模板的時(shí)候就進(jìn)行特例化(其實(shí)這樣失去了模板的優(yōu)勢了,唯一好點(diǎn)的就是可以特例化多種形式) 在 原來的 T.cpp 中加上這段就可以特例化了(也可以加到 T.h 中) template int Max<int>(int& ,int& ); //int特例化 template double Max<double>(double& ,double& ); //double特例化 這樣編譯鏈接運(yùn)行,就可以了 要編譯成DLL的話,加上DLL的那個(gè)關(guān)鍵字就可以了 #ifdef DLL_EXPORTS #define DLLT_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endifC++現(xiàn)在這種編譯時(shí)的模板化機(jī)制,豈不是讓別個(gè)通用模板函數(shù)庫的開發(fā)商只能開源了?
總結(jié)
以上是生活随笔為你收集整理的关于模板函数/模板类编译成DLL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: extern用法详解
- 下一篇: 当心在Lib中定义非const全局变量
