Linux-(C/C++)動態連結庫生成以及使用(libxxx.so)
阿新 • • 發佈:2019-02-07
Linux中so檔案為共享庫,與windows下dll類似,不過實現要簡單。
so可以供多個程序使用,不同程序呼叫同一個so檔案,所使用so檔案不同。
so檔案源程式不需要main函式,有也不會被執行。
下面通過一個簡單例子,來學習.so檔案的製作跟使用(前提已經配置好環境)、
主要了解學習用C語言編譯一個動態連結庫,如何使用這個庫
1、通過簡單max函式,生成一個libmax.so連結庫
/* * max.c * * Created on: 2016年7月24日 * Author: Andy_Cong */ /*生成libmax.so連結庫*/ /* * # -shared 為連結庫 讓編譯器知道是要編譯一個共享庫 * # -fPIC(Position Independent Code) 編譯生成程式碼與位置無關 */ int max(int a,int b) { return a>b?a:b; } /* * gcc -Wall -g -fPIC -c max.c -o max.o * gcc -shared max.o -o libmax.so * -g -Wall 供除錯使用,不是必須的 */
編譯結果:生成libmax.so
2、使用連結庫,需要包含標頭檔案(很正常,我們平時使用C庫函式也需要包含相關標頭檔案)
max.h標頭檔案如下
/*
* max.h
*
* Created on: 2016年7月24日
* Author: Andy_Cong
*/
#ifndef MAX_H_
#define MAX_H_
int max(int a,int b);
#endif /* MAX_H_ */
測試函式main.c如下
/* * main.c * * Created on: 2016年7月24日 * Author: Andy_Cong */ #include<stdio.h> #include"max.h" int main(void) { printf("call max function results is: %d\n",max(1,1)); return 0; } /* 使用libmax.so庫 * gcc -o main main.c -L. -lmax * *-L.: 在當前路徑下尋找.so檔案 *-lmax: 要連結這個libmax.so檔案 * * */
執行結果:生成可執行程式main(成功了)
3、使用C++編譯使用C語言提供的連結庫, 編譯連結出錯(下面只是簡單將main.c 改為main.cpp)
怎麼辦呢??
libmax這個庫僅適合C使用,C++並不適合,如果想編譯一個可以供C++使用。那麼標頭檔案(max.h)就需要改變,
需要額外增加一句:extern "C"
max.h(修改如下)
/* * max.h * * Created on: 2016年7月24日 * Author: Andy_Cong */ #ifndef MAX_H_ #define MAX_H_ extern "C" // 這句話可理解為,告訴編譯器,這個動態庫(.so)是用C語言寫的, // 需要用C語言連結方式來連結這個庫,這樣就可以g++來編譯了。 int max(int a,int b); #endif /* MAX_H_ */
執行結果
這樣就解決了。
4、但是這樣有一個問題,難道每次編譯都要改來改去,有沒有同時適合C/C連結庫的方法呢?
答案是有的,只需要改動標頭檔案即可,使用條件編譯
C++有一個巨集:__cplusplus 當用g++編譯的時候,就可以識別這個巨集
/*
* max.h
*
* Created on: 2016年7月24日
* Author: Andy_Cong
*/
/*條件編譯*/
#ifndef MAX_H_
#define MAX_H_
#ifdef __cplusplus
extern "C" //C++
{
#endif
int max(int a,int b);
#ifdef __cplusplus
}
#endif
#endif /* MAX_H_ */
然後發現寫到最後,才知道,main.c呼叫max函式時,居然使用同一個引數,好傻, 給自己狠狠一巴掌。