Linux静态链接库与模板类的处理方式

2019-01-16 22:49:53于海丽

在阅读本文之前,小编先给大家介绍一篇相关文章: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_H template<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静态链接库

 接下来,只需要将静态链接库编入main函数,就算完成了

出问题了,发现我们编译的静态链接库里面居然没有这个myQsortNoRecur函数,可是我明明在快速排序这个类SORT里面实现了这个函数啊。

用nm命令看下: