1. 程式人生 > >Linux-(C/C++)動態連結庫生成以及使用(libxxx.so)

Linux-(C/C++)動態連結庫生成以及使用(libxxx.so)

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函式時,居然使用同一個引數,好傻, 給自己狠狠一巴掌。