こんにちは、C++を使用して共有ライブラリ(データ構造)を学ぶために、それは私にこのエラーを与える私は私のプログラムを実行するたびにしようとしています共有ライブラリG ++エラーセグメンテーションフォールト
[email protected]:~$ cd /home/sachin/sDL
[email protected]:~/sDL$ g++ -fPIC -shared myclass.cc -o myclass.so
[email protected]:~/sDL$ g++ class_user.cc -ldl -o class_user
[email protected]:~/sDL$ ./class_user
0
Unable to load Sachin's library
Segmentation fault (core dumped)
[email protected]:~/sDL$
shared.hファイル
typedef struct node
{
struct node *prev;
int data;
struct node *next;
}NODE,*PNODE;
class SinglyCLL
{
private :
PNODE head;
PNODE tail;
public :
SinglyCLL();
~SinglyCLL();
virtual void InsertFirst(int);
virtual void InsertLast(int);
virtual void InsertAtPosition(int,int);
virtual void DeleteFirst();
virtual void DeleteLast();
virtual void DeleteAtPosition(int);
virtual int Count();
virtual void Display();
};
myclass.ccファイル
#include"sharedfile.h"
#include<iostream>
using namespace std;
SinglyCLL::SinglyCLL()
{
head=NULL;
tail=NULL;
}
void SinglyCLL::InsertFirst(int ino)
{
PNODE temp=head;
PNODE newN=NULL;
newN=new NODE;
newN->next=NULL;
newN->data=ino;
newN->prev=NULL;
if((head==NULL)&&(tail==NULL))
{
head=newN;
tail=newN;
tail->next=head;
head->prev=tail;
}
newN->next=head;
head->prev=newN;
head=newN;
tail->next=head;
head->prev=tail;
}
void SinglyCLL::Display()
{
PNODE temp=head;
if((head==NULL)&&(tail==NULL))
{
return;
}
do
{
cout<<temp->data<<endl;
temp=temp->next;
}while(tail->next!=temp);
}
SinglyCLL::~SinglyCLL()
{
delete head;
delete tail;
}
extern "C"
{
SinglyCLL *create()
{
return new SinglyCLL;
}
void destroy (SinglyCLL* p)
{
delete p;
}
}
class_user.ccファイル
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <iostream>
#include "sharedfile.h"
using namespace std;
int main()
{
void *p=NULL;
SinglyCLL *ptr=NULL;
SinglyCLL* (*fp1)()=NULL;
void (*fp2)(SinglyCLL*)=NULL;
p=dlopen("/home/sachin/sDL/myclass.so",RTLD_LAZY);
if(!p)
{
cout<<p<<endl;
printf("Unable to load Sachin's library \n");
}
fp1=(SinglyCLL*(*)())dlsym(p,"create");
fp2=(void(*)(SinglyCLL*))dlsym(p,"destroy");
ptr=fp1();
ptr->InsertFirst(10);
/*ptr->InsertAtPosition(70,1);
ptr->InsertAtPosition(80,2);*/
ptr->Display();
fp2(ptr);
dlclose(p);
return 0;
}
プログラム内でこのプログラムのセグメンテーションフォルトが発生するたびに、データを格納するリンクリストを作成するために単一の循環リストを使用しています 、コードを通過してエラーが見つかりませんでした私は何もエラーなしで正常に実行されている共有ライブラリと単独でリンクされたリストを実行しようとしたとして実行されていない理由を理解することができない、私はファイルにアクセスするためのアクセス許可をチェックし、だから問題はない。
私は教育目的のためだけにデータ構造共有ライブラリを作成することを学んでいるので、問題の原因となっている部分の外でこのコードで改善や変更の可能性があります。
この問題を解決するのを手伝ってください。
ありがとうございます。
lddは、そのバイナリの実行時にロードされる.soを表示します。あなたのためにギャップがある場合、それは実行時にローダーがそれを見つけられないことを意味します。環境変数LD_LIBRARY_PATHを設定する必要があります。そして、.soと論理の問題を抱かないでください。リンクされたリストを試す前に.soから簡単な関数を呼び出すことができるかどうかを見てください。 –
Elan
'head'と' tail'が同じものを指している場合は、二重の 'delete'を行います。 – greatwolf
'dlerror'を呼び出してエラーメッセージを取得します。 – molbdnilo