真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言使用so文件的函數(shù) c++生成so

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

-lxx

員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團隊的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)堅持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因為“專注所以專業(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),成都小程序開發(fā),軟件按需求定制開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。

xx是你的.so文件名

其實使用方法和你使用數(shù)學(xué)庫函數(shù)是一樣的,源代碼中添加

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

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

擴展資料:?

linux下編寫調(diào)用so文件實例

.so是Linux(Unix)下的動態(tài)鏈接庫. 和.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中的函數(shù), libXXX.so地址是MYPATH?

gcc d.c -o d -LMYPATH -lXXX

注意不是-llibXXX

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

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

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

怎樣動態(tài)調(diào)用.so文件中的類方法

相關(guān)接口:

#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; //打開動態(tài)鏈接庫

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

}

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

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

}

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

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; //打開動態(tài)鏈接庫

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

}

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

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

}

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

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; //打開動態(tài)鏈接庫

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

}

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

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

}

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

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; //打開動態(tài)鏈接庫

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

}

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

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

}

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

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; //打開動態(tài)鏈接庫

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

}

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

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

}

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

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庫中,函數(shù)前必須添加 exter "C"

函數(shù)參數(shù)類型為指針,不或以為引用

*/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

錯誤:

未找到符合

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

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

根據(jù)相應(yīng)的頭文件、和鏈接使用的庫文件,編譯鏈接后,即是可以使用該.so文件了

~~~~~~~

Linux c++開發(fā).so文件的使用

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

gcc -fPIC -shared

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

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

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

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

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

-l xx.so

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

-lxx

xx是你的.so文件名

其實使用方法和你使用數(shù)學(xué)庫函數(shù)是一樣的,源代碼中添加

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

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

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

C語言調(diào)用C++的so

首先C要調(diào)用的C++的函數(shù)必須是extern "C"聲明的。

其次編譯C程序時需要增加鏈接libstdc++.so(可能名字不打?qū)ψ约翰椴椋?/p>
分享題目:c語言使用so文件的函數(shù) c++生成so
分享URL:http://weahome.cn/article/hghehs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部