我想寫一個共享庫打開和函數調用進行練習的基本示例,但事實證明,當exectuable實際運行時,我總是得到「分段錯誤」 。下面是源代碼:共享庫調用函數(Linux)獲取分割錯誤
main.cpp中:
#include<iostream>
#include<dlfcn.h>
using namespace std;
typedef void (*API)(unsigned int);
int main(int argc,char** argv){
void* dl;
API api;
unsigned int tmp;
//...
dl=dlopen("pluginA.so",RTLD_LAZY);
api=(API)dlsym(dl,"API");
cin>>tmp;
(*api)(tmp);
dlclose(dl);
//...
return 0;
}
pluginA.cpp:
#include<iostream>
using namespace std;
extern "C" void API(unsigned int N){switch(N){
case 0:cout<<"1\n"<<flush;break;
case 1:cout<<"2\n"<<flush;break;
case 2:cout<<"4\n"<<flush;break;
case 4:cout<<"16\n"<<flush;break;}}
我編譯所述兩個部分具有下面的命令:
g++ -shared -o pluginA.so -fPIC plugin.cpp
g++ main.cpp -ldl
這裏是輸出
Segmentation fault (core dumped)
順便說一句,我也試過直接調用API(TMP),而不是(* API)(TMP),也不起作用。由於api是一個指針,(* api)更有意義?
我不知道該怎麼辦。在線共享庫中有很多關於調用函數的概念,但是其中大多數沒有完全編碼,或者實際上並不工作。
而且我不知道我該怎麼處理「」屬性((visibility(「default」)))「。我應該寫下來嗎?
EDT1 謝謝你給了我這麼多的建議。我終於發現,實際上在編譯命令時,一切都是拼寫錯誤...我錯誤地將pluginA.so輸入到pluginA.o,這就是它不工作的原因...
無論如何,這裏是我的修改程序,錯誤處理加入,更加「全面」系統還說:
main.cpp中:
#include<dirent.h>
#include<dlfcn.h>
#include<iostream>
#include<cstring>
using namespace std;
typedef bool (*DLAPI)(unsigned int);
int main(){
DIR* dldir=opendir("dl");
struct dirent* dldirf;
void* dl[255];
DLAPI dlapi[255];
unsigned char i,dlc=0;
char dldirfname[255]="./dl/";
unsigned int n;
while((dldirf=readdir(dldir))!=NULL){
if(dldirf->d_name[0]=='.')continue;
strcat(dldirfname,dldirf->d_name);
dl[dlc]=dlopen(dldirfname,RTLD_LAZY);
if(!dl[dlc])cout<<dlerror()<<endl;else{
dlapi[dlc]=(DLAPI)dlsym(dl[dlc],"API");
if(!dlapi[dlc])cout<<dlerror()<<endl;else dlc++;}
dldirfname[5]='\0';}
if(dlc==0){
cerr<<"ERROR:NO DL LOADED"<<endl;
return -1;}
while(true){
cin>>n;
for(i=0;i<dlc;i++)if((*dlapi[i])(n))break;
if(i==dlc)cout<<"NOT FOUND"<<endl;}
for(i=0;i<dlc;i++)dlclose(dl[i]);
return 0;}