精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

c語言使用so文件的函數 c++生成so

請問我有一個.so文件,如何在Linux下編程使用呢?

-lxx

員工經過長期磨合與沉淀,具備了協作精神,得以通過團隊的力量開發出優質的產品。成都創新互聯堅持“專注、創新、易用”的產品理念,因為“專注所以專業、創新互聯網站所以易用所以簡單”。公司專注于為企業提供網站設計、做網站、微信公眾號開發、電商網站開發,成都小程序開發,軟件按需求定制開發等一站式互聯網企業服務。

xx是你的.so文件名

其實使用方法和你使用數學庫函數是一樣的,源代碼中添加

#include math.h,編譯的時候,加上-lm參數。

注:linux下的.so文件為共享庫,相當于windows下的dll文件。

擴展資料:?

linux下編寫調用so文件實例

.so是Linux(Unix)下的動態鏈接庫. 和.dll類似.

比如:

文件有: a.c, b.c, c.c

gcc -c a.c

gcc -c b.c

gcc -c c.c

gcc -shared libXXX.so a.o b.o c.o

要使用的話也很簡單. 比如編譯d.c, 使用到libXXX.so中的函數, libXXX.so地址是MYPATH?

gcc d.c -o d -LMYPATH -lXXX

注意不是-llibXXX

test.c文件和一個test.h,這兩個文件要生成libsotest.so文件。然后我還有一個testso.c文件,在這個文件里面調用libsotest.so中的函數。

編寫的過程中,首先是編譯so文件,我沒有編寫makefile文件,而是參考的2里面說的直接寫的gcc命令。

因為so文件里面沒有main函數,所以是不可執行的,所以編譯的時候要加上-c,只生成目標文件。

怎樣動態調用.so文件中的類方法

相關接口:

#include dlfcn.hvoid *dlopen(const char *filename, int flag);char *dlerror(void);void *dlsym(void *handle, const char *symbol);int dlclose(void *handle);123456789

eg:

dlapi.c

/*

[root@localhost eg]# gcc main.c -Wl,-rpath=./ -ldl -D_TEST

[root@localhost eg]# g++ main.c -Wl,-rpath=./ -ldl -D_TEST

*/#include stdio.h#include stdlib.h#include unistd.h#include dlfcn.h#ifdef __cplusplusextern "C" {#endiftypedef int (*PCall_func0)();typedef int (*PCall_func1)(void *);typedef int (*PCall_func2)(void *, void *);typedef int (*PCall_func3)(void *, void *, void *);typedef int (*PCall_func4)(void *, void *, void *, void *);int dynamic_call_library_func0(char *libName, char *funcName)

{

void *handle; void *error;

PCall_func0 selffunc=NULL; int ret; if(libName == NULL)return -9000; if(funcName == NULL)return -9001; //打開動態鏈接庫

handle = dlopen(libName, RTLD_LAZY); if (!handle) { printf("%s\n", dlerror()); return -9000;

}

dlerror(); //獲取一個函數

selffunc = (PCall_func0)dlsym(handle, funcName); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return -9001;

}

ret = selffunc(); //dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

dlclose(handle); return ret;

}int dynamic_call_library_func1(char *libName, char *funcName, void *argv1)

{

void *handle; void *error;

PCall_func1 selffunc=NULL; int ret; if(libName == NULL)return -9000; if(funcName == NULL)return -9001; //打開動態鏈接庫

handle = dlopen(libName, RTLD_LAZY); if (!handle) { printf("%s\n", dlerror()); return -9000;

}

dlerror(); //獲取一個函數

selffunc = (PCall_func1)dlsym(handle, funcName); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return -9001;

}

ret = selffunc(argv1); //dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

dlclose(handle); return ret;

}int dynamic_call_library_func2(char *libName, char *funcName, void *argv1, void *argv2)

{

void *handle; void *error;

PCall_func2 selffunc=NULL; int ret; if(libName == NULL)return -9000; if(funcName == NULL)return -9001; //打開動態鏈接庫

handle = dlopen(libName, RTLD_LAZY); if (!handle) { printf("%s\n", dlerror()); return -9000;

}

dlerror(); //獲取一個函數

selffunc = (PCall_func2)dlsym(handle, funcName); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return -9001;

}

ret = selffunc(argv1, argv2); //dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

dlclose(handle); return ret;

}int dynamic_call_library_func3(char *libName, char *funcName, void *argv1, void *argv2, void *argv3)

{

void *handle; void *error;

PCall_func3 selffunc=NULL; int ret; if(libName == NULL)return -9000; if(funcName == NULL)return -9001; //打開動態鏈接庫

handle = dlopen(libName, RTLD_LAZY); if (!handle) { printf("%s\n", dlerror()); return -9000;

}

dlerror(); //獲取一個函數

selffunc = (PCall_func3)dlsym(handle, funcName); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return -9001;

}

ret = selffunc(argv1, argv2, argv3); //dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

dlclose(handle); return ret;

}int dynamic_call_library_func4(char *libName, char *funcName, void *argv1, void *argv2, void *argv3, void *argv4)

{

void *handle; void *error;

PCall_func4 selffunc=NULL; int ret; if(libName == NULL)return -9000; if(funcName == NULL)return -9001; //打開動態鏈接庫

handle = dlopen(libName, RTLD_LAZY); if (!handle) { printf("%s\n", dlerror()); return -9000;

}

dlerror(); //獲取一個函數

selffunc = (PCall_func4)dlsym(handle, funcName); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); return -9001;

}

ret = selffunc(argv1, argv2, argv3, argv4); //dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

dlclose(handle); return ret;

}#ifdef _TESTint main(int rgvs, char **rgva)

{char buff[]="asdfasdf";int x=8;printf("main gcc build\n");printf("g_path gcc libeggcc.so char *\n");

dynamic_call_library_func1("/home/workspace/eg/libeggcc.so", "show1", buff);printf("g_path g++ libegg++.so char *\n");

dynamic_call_library_func1("/home/workspace/eg/libegg++.so", "show1", buff);printf("../lib path gcc libeggcc.so char *\n");

dynamic_call_library_func1("libeggcc.so", "show1", buff);printf("../lib path g++ libegg++.so char *\n");

dynamic_call_library_func1("libegg++.so", "show1", buff);printf("g_path gcc libeggcc.so int\n");

dynamic_call_library_func1("/home/workspace/eg/libeggcc.so", "show2", x);printf("g_path g++ libegg++.so int\n");

dynamic_call_library_func1("/home/workspace/eg/libegg++.so", "show2", x);printf("../lib path gcc libeggcc.so int\n");

dynamic_call_library_func1("libeggcc.so", "show2", x);printf("../lib path g++ libegg++.so int\n");

dynamic_call_library_func1("libegg++.so", "show2", x); return 0;

}#endif#ifdef __cplusplus}#endif123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222

dlapi.h

#ifndef _DL_API_H#define _DL_API_H#ifdef __cplusplusextern "C" {#endif/*

使用g++編譯的.so庫中,函數前必須添加 exter "C"

函數參數類型為指針,不或以為引用

*/int dynamic_call_library_func0(char *libName, char *funcName) ;int dynamic_call_library_func1(char *libName, char *funcName, void *argv1) ;int dynamic_call_library_func2(char *libName, char *funcName, void *argv1, void *argv2) ;int dynamic_call_library_func3(char *libName, char *funcName, void *argv1, void *argv2, void *argv3) ;int dynamic_call_library_func4(char *libName, char *funcName, void *argv1, void *argv2, void *argv3, void *argv4) ;#ifdef __cplusplus}#endif#endif1234567891011121314151617181920212223242526

eg.c

/*

[root@localhost eg]# gcc eg.c -fPIC -shared -o libeggcc.so[root@localhost eg]# g++ eg.c -fPIC -shared -o libegg++.so*/#include stdio.h#include stdlib.h#include string.h#include unistd.h#include sys/socket.h#include netinet/in.h#include arpa/inet.hint show1(char *src)

{ printf("%s\n", src); return 100;

}int show2(int *x)

{ printf("%2d\n", *x); return 101;

}12345678910111213141516171819202122232425262728293031

eg.cpp

/*

[root@localhost eg]# gcc eg.c -fPIC -shared -o libeggcc.so

[root@localhost eg]# g++ eg.c -fPIC -shared -o libegg++.so

*/#include stdio.h#include stdlib.h#include string.h#include unistd.h#include sys/socket.h#include netinet/in.h#include arpa/inet.hextern "C" int show1(char *src)

{ printf("%s\n", src); return 100;

}extern "C" int show2(int *x)

{ printf("%2d\n", *x); return 101;

}12345678910111213141516171819202122232425262728293031

main.c

/*

[root@localhost eg]# gcc main.c -Wl,-rpath=./ -ldl -D_TEST

[root@localhost eg]# g++ main.c -Wl,-rpath=./ -ldl -D_TEST

*/#include stdio.h#include stdlib.h#include unistd.h#include dlfcn.h#include "dlapi.h"int main(int rgvs, char **rgva)

{char buff[]="asdfasdf";int x=8;int ret;printf("main gcc build\n");printf("\ng_path gcc libeggcc.so char *\n");

ret = dynamic_call_library_func1("/home/workspace/eg/libeggcc.so", "show1", buff);printf("\ng_path g++ libegg++.so char *\n");

dynamic_call_library_func1("/home/workspace/eg/libegg++.so", "show1", buff);printf("\ncur lib path gcc libeggcc.so char *\n");

dynamic_call_library_func1("libeggcc.so", "show1", buff);printf("\ncur lib path g++ libegg++.so char *\n");

dynamic_call_library_func1("libegg++.so", "show1", buff);printf("\ng_path gcc libeggcc.so int\n");

dynamic_call_library_func1("/home/workspace/eg/libeggcc.so", "show2", x);printf("\ng_path g++ libegg++.so int\n");

dynamic_call_library_func1("/home/workspace/eg/libegg++.so", "show2", x);printf("\ncur lib path gcc libeggcc.so int\n");

dynamic_call_library_func1("libeggcc.so", "show2", x);printf("\ncur path g++ libegg++.so int\n");

dynamic_call_library_func1("libegg++.so", "show2", x); return 0;

}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

makefile

all:

gcc eg.c -fPIC -shared -o libeggcc.so

g++ eg.cpp -fPIC -shared -o libegg++.so

gcc dlapi.c -ldl -fPIC -shared -o libdlapi.so

g++ main.c -L. -ldlapi -Wl,-rpath=./ -Wl,-rpath=./lib

123456

引用:

百度 dlopen(3) - Linux man page

錯誤:

未找到符合

該函數的定義沒有鏈接進.so文件中時,在鏈接時加上-Wl,-z -Wl,defs參數,可以避免這個問題

linux下如何用c++編譯so文件,c語言又怎樣調用這個so文件

根據相應的頭文件、和鏈接使用的庫文件,編譯鏈接后,即是可以使用該.so文件了

~~~~~~~

Linux c++開發.so文件的使用

假設在linux上用gcc編譯程序,需要用下列編譯選項生成.so文件:

gcc -fPIC -shared

.so 文件安裝一般是在/usr/lib或者/usr/local/lib下,安裝后不需要絕對路徑即可使用。當然你也可以安裝到工程文件夾下面,不過很少有這么做的。使用時只需要dlopen()函數打開這個庫,用dlsym()函數將動態庫的函數體加載進來;同樣已加載的動態函數庫可以用dlclose()關閉。

詳細使用方法百度搜dlopen 即可。

linux的C編程,怎么使用so文件

linux下的.so文件為共享庫,相當于windows下的dll文件,使用方法如下:

在你的工程源代碼里包含.h頭文件,然后可以調用動態庫里的函數,在鏈接的時候加上如下編譯器參數:

-l xx.so

如果你的so文件是以lib開頭的,還可以直接這樣使用:

-lxx

xx是你的.so文件名

其實使用方法和你使用數學庫函數是一樣的,源代碼中添加

#include math.h,編譯的時候,加上-lm參數。

linux下如何用c++編譯so文件,c語言又怎樣調用這個so文件

C++編譯so文件與C編譯so一樣都是加參數 -shared

C語言調用C++的so

首先C要調用的C++的函數必須是extern "C"聲明的。

其次編譯C程序時需要增加鏈接libstdc++.so(可能名字不打對自己查查)


新聞名稱:c語言使用so文件的函數 c++生成so
URL網址:http://m.jcarcd.cn/article/hghehs.html
主站蜘蛛池模板: 日本妞干网 | 成人免费a| 欧美日夜干影院 | 亚洲无码射在线视频 | 欧美亚洲精品suv | 国产日韩中文字幕 | 国产精品一区二正 | 福利导航网站 | 欧美日韩一卡二区 | 日韩亚洲欧美 | 福利在线视频欧美 | 国产日韩在线精品 | 国产网红福利 | 韩日午夜 | 91大神是啥 | 日韩经典视频 | 欧美一级爽快片婬 | 成人羞羞国产免费 | 无码av天堂一区二区三区 | 91色在线 | 91蜜桃传媒吴梦梦 | 日本黄页网址 | 区二区导航 | 精品91视频网站 | 琪琪色好看在线观看 | 区二区网站视频 | 国产精品日韩精 | 精品伊人| 91视频福利| 国内自拍小视频 | 欧美一区韩国二区老 | 日本中文一 | 日韩欧美在线综合网 | 日本精品专区在线 | 国产不卡一二三 | 91亞洲播播 | 国产精品视频 | 精品免费国产影视 | 欧美一级高清 | 波多野结 | 日韩国产网曝 |