亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

Linux靜態鏈接庫與模板類的處理方式

2024-09-05 23:04:21
字體:
來源:轉載
供稿:網友

在閱讀本文之前,小編先給大家介紹一篇相關文章:Linux靜態鏈接庫使用類模板的快速排序算法

大家首先看下以上的文章對理解下面的知識點會有很大的幫助。

當模板遇到靜態鏈接庫會發生什么呢。

我們先按照常規思路去考慮一個靜態鏈接庫的步驟:

1.將某些功能提取出來,放進一個cpp文件,并將接口或者對外導出的類放在頭文件中

2.gcc -c編譯該文件,生成.o

3.ar命令將.o文件打包成.a,即靜態鏈接庫

4.編譯main函數,并將該靜態鏈接庫鏈接,生成可執行文件。

OK,按照這個思路,我們將之前寫的快速排序代碼修改后,如下:

lib_test.h:

//lib_test.h//head file of quick sort//users should realise operator > and <#ifndef LIB_TEST_H#define LIB_TEST_Htemplate<class T>class SORT{public:static void myQsort(T a[], int p, int r);static void myQsortNoRecur(T a[], int p, int r);private:static int partition(T a[], int p, int r);static void exchange(T a[], int i, int j);};#endif

lib_test.cc:

//lib_test.cc#include <iostream>#include <stack>#include"stdlib.h"#include <time.h>#include "lib_test.h"using namespace std;template<class T>void SORT<T>::exchange(T a[], int i, int j){T temp = a[i];a[i] = a[j];a[j] = temp;return;}template<class T>int SORT<T>::partition(T a[],int p,int r){int i = p;int j = p-1;T ref = a[p];int refId = p;srand((unsigned)time(NULL));refId = (rand() % (r-p+1))+ p;//cout<<refId<<endl;ref = a[refId];for(; i<=r; i++){if(a[i] < ref){j++;exchange(a, i, j);if(j == refId){refId = i;}}}exchange(a, j+1, refId);return j+1;}template<class T>void SORT<T>::myQsort(T a[],int p,int r){int q = 0;if(p<r){q = partition(a, p, r);myQsort(a, p, q-1);myQsort(a, p+1, r);}return;}template<class T>void SORT<T>::myQsortNoRecur(T a[], int p, int r){int start = p;int end = r;int mid = 0;std::stack<int> sortStk;sortStk.push(p);sortStk.push(r);while(!sortStk.empty()){end = sortStk.top();sortStk.pop();start = sortStk.top();sortStk.pop();if(start < end){mid = partition(a, start, end);sortStk.push(start);sortStk.push(mid -1);sortStk.push(mid + 1);sortStk.push(end);}}}

OK,我們嘗試編譯.a靜態鏈接庫

Linux,靜態鏈接庫,模板類,處理方式

 接下來,只需要將靜態鏈接庫編入main函數,就算完成了

Linux,靜態鏈接庫,模板類,處理方式

出問題了,發現我們編譯的靜態鏈接庫里面居然沒有這個myQsortNoRecur函數,可是我明明在快速排序這個類SORT里面實現了這個函數啊。

用nm命令看下:

Linux,靜態鏈接庫,模板類,處理方式

實實在在的,符號很少,確實沒有我之前寫的函數。這就奇怪了,今天下午在網上搜了很久,原來是模板類的原因導致的:

因為在編譯動態鏈接庫中,我們并沒有指定template class的type,那么靜態鏈接庫中自然不知道按照什么type去編譯該class中成員函數。

參考文獻:在動態庫和靜態庫中使用模板(dynamic libraries ,static libraries)

有沒有解決辦法呢?答案是肯定的,只要我們在靜態鏈接庫中申明一個type,并調用該指定type的函數,那么靜態鏈接庫中就有函數原型了。

我覺得可以把該過程稱為接口的“實例化”過程........

現在把lib_test.cc修改如下:

//lib_test.cc#include <iostream>#include <stack>#include"stdlib.h"#include <time.h>#include "lib_test.h"using namespace std;template<class T>void SORT<T>::exchange(T a[], int i, int j){T temp = a[i];a[i] = a[j];a[j] = temp;return;}template<class T>int SORT<T>::partition(T a[],int p,int r){int i = p;int j = p-1;T ref = a[p];int refId = p;srand((unsigned)time(NULL));refId = (rand() % (r-p+1))+ p;//cout<<refId<<endl;ref = a[refId];for(; i<=r; i++){if(a[i] < ref){j++;exchange(a, i, j);if(j == refId){refId = i;}}}exchange(a, j+1, refId);return j+1;}template<class T>void SORT<T>::myQsort(T a[],int p,int r){int q = 0;if(p<r){q = partition(a, p, r);myQsort(a, p, q-1);myQsort(a, p+1, r);}return;}template<class T>void SORT<T>::myQsortNoRecur(T a[], int p, int r){int start = p;int end = r;int mid = 0;std::stack<int> sortStk;sortStk.push(p);sortStk.push(r);while(!sortStk.empty()){end = sortStk.top();sortStk.pop();start = sortStk.top();sortStk.pop();if(start < end){mid = partition(a, start, end);sortStk.push(start);sortStk.push(mid -1);sortStk.push(mid + 1);sortStk.push(end);}}}namespace quick_sort_instance{void template_instance(){int a[]={1,2};SORT<int>::myQsortNoRecur(a, 0, 1);}}

好,重復上面的編譯過程:

Linux,靜態鏈接庫,模板類,處理方式

這些編譯和執行過程就能正常進行了。

 

但是這種所謂的“實例化”過程有一個明顯的缺點,那就是,本身這個SORT類是一個模板類,可以排序任意類型的數據,

就本例子而言,只“實例化”了一種int類型的接口。因此當我想排序一個float類型的數組時,我就必須在.a文件里面再“實例化”一個float接口。

顯然,假如我想把該具有sort功能的類,抽象成一個獨立的模塊,但是我并不知道該.a的用戶想排序的數據類型是什么,那么將必須窮舉所有的數據類型

這顯然是不可能的。這一局限性不只時模板類,同樣的,模板函數也是如此。

結論:最好不要在靜態鏈接庫中使用模板,同樣的,動態鏈接庫也一樣。

想到這里,腦子里忽然蹦出來一個想法:C++的STL到底是動態鏈接韓式靜態鏈接的呢?STL使用了大量的模板,按照這篇博客在討論的內容,似乎是矛盾的。在網上找了半天

參考知乎的大神們是怎么解釋的吧:

https://www.zhihu.com/question/46098144

以上就是本文的全部心得和內容,如果大家還有所疑問和建議,可以在下面的留言區討論。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本视频久久久| 国产区亚洲区欧美区| 91极品女神在线| 日本不卡高字幕在线2019| 成人亲热视频网站| 欧美性高潮床叫视频| 欧美激情国内偷拍| 韩国国内大量揄拍精品视频| 中文字幕日韩有码| 亚洲国产成人精品久久久国产成人一区| 日韩视频免费观看| 日韩av不卡在线| 国产成人精品网站| 亚洲图片欧洲图片av| 国产精欧美一区二区三区| 精品欧美激情精品一区| 亚洲精品一区中文字幕乱码| 欧美午夜丰满在线18影院| 成人h视频在线观看播放| 成人免费淫片aa视频免费| 久久视频在线看| 亚洲电影成人av99爱色| 国产精品久久久久9999| 亚洲电影在线观看| 欧美一区二区.| 亲子乱一区二区三区电影| 国产99久久久欧美黑人| 欧美在线播放视频| 亚洲人成网在线播放| 亚洲日本成人网| 欧美激情国产精品| 欧美成人精品xxx| 国产成人综合av| 久久综合五月天| 欧美成人免费小视频| 日韩亚洲一区二区| 亚州国产精品久久久| 国外成人在线视频| 欧美日韩福利在线观看| 亚洲精品一区久久久久久| 欧美日韩国产精品一区二区三区四区| 亚洲视频一区二区| 日本一区二区在线免费播放| 国产亚洲欧美另类中文| 国产日韩欧美视频在线| 亚洲欧洲日本专区| 日韩在线视频网| 久久久久久久97| 国产最新精品视频| 91视频免费在线| 性欧美xxxx视频在线观看| 成人xvideos免费视频| 欧美亚洲国产日韩2020| 国产精品九九久久久久久久| 综合136福利视频在线| 国产亚洲激情在线| 国产亚洲美女精品久久久| 国产在线视频欧美| 亚洲视频在线免费观看| 亚洲人成电影网站色xx| 26uuu亚洲伊人春色| 最近2019中文字幕大全第二页| 国产亚洲精品日韩| 成人高h视频在线| 久久亚洲精品小早川怜子66| 日韩动漫免费观看电视剧高清| 成人春色激情网| 久久久久久久久久久久av| 久久综合伊人77777| 国产精品pans私拍| 国产精品美女无圣光视频| 久久九九国产精品怡红院| 亚洲精品成人久久电影| 久久99久国产精品黄毛片入口| 亚洲女在线观看| 欧美与黑人午夜性猛交久久久| 久久精品国产精品亚洲| 国内久久久精品| 成人性生交大片免费观看嘿嘿视频| 91a在线视频| 在线观看亚洲视频| 亚洲专区国产精品| 欧美日韩国产一区二区| 欧美一级在线亚洲天堂| 日韩免费观看在线观看| 国产精品99蜜臀久久不卡二区| 国产亚洲精品久久久久久| 国产精品女主播视频| 欧美福利小视频| 精品日韩美女的视频高清| 欧美夜福利tv在线| 伊人伊成久久人综合网小说| 91精品久久久久久久久不口人| 亚洲毛片在线免费观看| 欧美成人在线免费| 国产成人av在线| 亚洲欧美福利视频| 亚洲激情国产精品| 日韩精品欧美国产精品忘忧草| 欧美超级免费视 在线| 国产精品亚洲网站| 中文字幕av一区中文字幕天堂| 欧美日韩国产成人在线观看| 国产精品网站入口| 日韩美女免费视频| 久久久久久久久久亚洲| 欧美一区二区三区……| 久久久久久国产免费| 日韩av影视综合网| 欧美极品在线播放| 亚洲最大福利视频网站| 国产亚洲欧美另类中文| 国产一区二区三区精品久久久| 亚洲精品资源在线| 国产在线a不卡| 久久久av网站| 国产69精品久久久久久| 综合欧美国产视频二区| 久久99视频免费| 亚洲性69xxxbbb| 97婷婷涩涩精品一区| 国产精品一区二区三区久久久| 日韩亚洲欧美成人| 国产成人+综合亚洲+天堂| 91视频国产高清| 久久久视频免费观看| 91在线观看免费高清完整版在线观看| 国产偷国产偷亚洲清高网站| 久久成人这里只有精品| 欧美亚洲第一区| 欧美激情精品久久久久久黑人| 成人黄色片在线| 日韩美女激情视频| 成人欧美在线观看| 久久久久国产一区二区三区| 亚洲国产精品网站| 日韩av成人在线观看| 欧美一级片免费在线| 亚洲片在线资源| 中文字幕欧美精品在线| 日韩av网址在线观看| 久久久久久久久久久国产| 久久夜色精品国产欧美乱| 欧美激情精品久久久| 国产一区二区三区在线观看网站| 亚洲精品99999| 日本精品性网站在线观看| 精品一区二区三区四区| 中文字幕国产精品久久| 久久国产精品久久国产精品| 深夜福利国产精品| 欧美黄色片视频| 欧美另类高清videos| 日韩av在线看| 91成人在线观看国产| 精品视频在线播放色网色视频| 成人国产精品一区| 久久青草精品视频免费观看| 成人免费在线视频网站| 亚洲国产成人爱av在线播放| 久久人人爽国产| 国产精品一区二区三区在线播放| 亚洲伊人久久大香线蕉av| 欧美色播在线播放|