日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .

發布時間:2023/12/15 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.o 就相當于windows里的obj文件

.a 是好多個.o合在一起,用于靜態連接

.so 是shared object,用于動態連接的,和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庫

gcc -shared -o libblog.so input.c

用該命令就把.c文件變成了so庫

2.編譯.c文件為可執行文件

*如果你在你的.c文件文件中包括了包含so庫函數聲明的頭文件,

則你在編譯時用的命令為:

gcc -L/your/lib/path -lblog -o blogexe blogexe.c

以上so庫名稱必須為libblog.so(linux 省略掉了lib等);

*如果你希望在你的程序里運行時加載,用dlopen的方式打開,使用庫里面的函數和數據。

則返回函數的形式( 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文件里面函數和符號的導出

在需要導出變量和函數的前面加上extern "C"

詳細說明

-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的,所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正的代碼段共享的目的

-L. :表示要連接的庫在當前的目錄中

-lmy:編譯器查找動態鏈接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名字

總結

以上是生活随笔為你收集整理的linux编写日志接口so,linux下动态链接问题(.so文件的编写与调用) .的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。