linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .
.o 就相當(dāng)于windows里的obj文件
.a 是好多個(gè).o合在一起,用于靜態(tài)連接
.so 是shared object,用于動(dòng)態(tài)連接的,和dll差不多
sotest.c
#include
int test(int a){
printf("#########:%d\n",a);
return a;
}
//
test.c
#include int test(int a);
int main(int argc,char argv[])
{
int num=0;
num =test(2);
printf("num:%d\n",num);
return 0;
}
分析GCC的兩條命令
1.把.c文件變成so庫(kù)
gcc -shared -o libblog.so input.c
用該命令就把.c文件變成了so庫(kù)
2.編譯.c文件為可執(zhí)行文件
*如果你在你的.c文件文件中包括了包含so庫(kù)函數(shù)聲明的頭文件,
則你在編譯時(shí)用的命令為:
gcc -L/your/lib/path -lblog -o blogexe blogexe.c
以上so庫(kù)名稱必須為libblog.so(linux 省略掉了lib等);
*如果你希望在你的程序里運(yùn)行時(shí)加載,用dlopen的方式打開,使用庫(kù)里面的函數(shù)和數(shù)據(jù)。
則返回函數(shù)的形式( man dlopen 的舉例)為:
int (*cos)(double);
cos=dlsym(dl-handle,"cos");
printf("%f",(*cos)(2.0));
或者這樣
typedef int (*COSFN)(double);
COSFN cos;
cos=dlsym(dl-handle,"cos");
printf("%f",cos(2.0));
必須這樣編譯:
gcc -rdynamic -s -o blogexe blogexe.c -ldl
3.cpp文件里面函數(shù)和符號(hào)的導(dǎo)出
在需要導(dǎo)出變量和函數(shù)的前面加上extern "C"
詳細(xì)說(shuō)明
-fPIC:表示編譯為位置獨(dú)立的代碼,不用此選項(xiàng)的話編譯后的代碼是位置相關(guān)的,所以動(dòng)態(tài)載入時(shí)是通過(guò)代碼拷貝的方式來(lái)滿足不同進(jìn)程的需要,而不能達(dá)到真正的代碼段共享的目的
-L. :表示要連接的庫(kù)在當(dāng)前的目錄中
-lmy:編譯器查找動(dòng)態(tài)鏈接庫(kù)時(shí)有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來(lái)確定庫(kù)的名字
總結(jié)
以上是生活随笔為你收集整理的linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux中自动挂载脚本,LIUNX一键
- 下一篇: linux tmux 详细教程,Linu