SEGFAULT:C中动态库的Makefile
我正在尝试创建一个Makefile,它将编译并链接一个主文件selena-4.c和我的共享库lib-selena.so。主文件使用dlopen动态使用共享库 (上下文:我们的家庭作业是上一个家庭作业,其中我们必须创建一个程序,创建一个节点数与用户输入的命令行相同的链表,并将其划分为不同的文件(带有头文件)练习创建共享库和静态库(&p)。这是最后一步:创建新的主文件:selena-4.c&使用dlopen动态打开我们在上一步中创建的共享库。) (顺便说一句,我已经交了作业,但我想知道我哪里做错了,这样我就能在明天的期末考试中取得好成绩。) 当我运行makefile时,我收到以下消息: lib selena.so:无法打开共享对象文件:没有此类文件或目录 分段故障(堆芯转储) 这是我的主要文件:SEGFAULT:C中动态库的Makefile,c,segmentation-fault,dynamic-library,C,Segmentation Fault,Dynamic Library,我正在尝试创建一个Makefile,它将编译并链接一个主文件selena-4.c和我的共享库lib-selena.so。主文件使用dlopen动态使用共享库 (上下文:我们的家庭作业是上一个家庭作业,其中我们必须创建一个程序,创建一个节点数与用户输入的命令行相同的链表,并将其划分为不同的文件(带有头文件)练习创建共享库和静态库(&p)。这是最后一步:创建新的主文件:selena-4.c&使用dlopen动态打开我们在上一步中创建的共享库。) (顺便说一句,我已经交了作业,但我想知道我哪里做错了,
#include "selena-4.h"
#include <dlfcn.h>
int main(int argc, char **argv)
{
void *tempHandle;
tempHandle = dlopen("lib-selena.so", RTLD_LAZY);
if(!tempHandle) printf("%s\n", dlerror());
int (*mainOne) (int argc, char **argv);
int (*mainTwo) (char **argv);
int (*mainThree) (void);
int (*mainFour) (void);
mainOne = dlsym(tempHandle, "main1");
mainTwo = dlsym(tempHandle, "main2");
mainThree = dlsym(tempHandle, "main3");
mainFour = dlsym(tempHandle, "main4");
mainOne(argc, &*argv);
mainTwo(&*argv);
mainThree();
mainFour();
dlclose(tempHandle);
return 0;
}
#define _GNU_SOURCE
#define _DEFAULT_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//This global struct acts as a 'node' with pointers to preceding and following
nodes, in addition to a unique number (the data field).
struct node
{
int data;
struct node *next;
struct node *prev;
};
typedef struct node _node; //our node struct will be referred to as '_node'
from now on
extern _node *head;
extern _node *tail;
extern _node *trashHead;
extern _node *trashTail;
int main(int argc, char **argv);
以下是我用来创建共享库的Makefile:
all: hw11THREE
COMP = gcc
CFLAGS = -fPIC -c -Wall
hw11THREE: selena-main.o lib-selena.so
gcc -o hw11THREE selena-main.o -lm ./lib-selena.so
selena-main.o: selena-main.c selena-main.h
$(COMP) $(CFLAGS) selena-main.c
selena-A.o: selena-A.c selena-A.h
$(COMP) $(CFLAGS) selena-A.c
selena-B.o: selena-B.c selena-B.h
$(COMP) $(CFLAGS) selena-B.c
selena-C.o: selena-C.c selena-C.h
$(COMP) $(CFLAGS) selena-C.c
selena-D.o: selena-D.c selena-D.h
$(COMP) $(CFLAGS) selena-D.c
lib-selena.so: selena-A.o selena-B.o selena-C.o selena-D.o
gcc -shared -o lib-selena.so selena-A.o selena-B.o selena-C.o selena-D.o
我非常感谢你们能给我的任何帮助!谢谢大家!
编辑:原始生成文件
全部:hw11FOUR
COMP = gcc
CFLAGS = -fPIC -c -Wall
hw11FOUR: selena-4.o lib-selena.so
gcc -o hw11FOUR selena-4.o -lm ./lib-selena.so -ldl
selena-4.o: selena-4.c
$(COMP) $(CFLAGS) selena-4.c
lib-selena.so: selena-4.o
gcc -shared -o lib-selena.so selena-4.o
如何“运行”Makefile?
lib selena.so
在哪里,您的LD\u LIBRARY\u路径是什么(首先,我想我们应该询问哪个平台)?如果我使用了不正确的术语,很抱歉。对您的问题的回答:(1)make-f Makefile4(2)它是在我运行另一个makefile时创建的,通过键入make-f Makefile3(3)我不确定--我如何才能找到它?(4) 你说的站台是什么意思?我在linux上这么做-这就是你的意思吗?你在哪里把你的可执行文件链接到lib selena.so
;您只能链接到dl
库。顺便说一句,lib selena
是个坏名字,因为链接器命令中的库名变成了-selena
,可能是转义了-
libselena。因此
是一个更好的名称。此外,您可能不希望在头文件中声明main
。我从来没有见过这样做,也许它并不痛,但它确实非常罕见。哦,所以即使我使用dlopen,我仍然需要这样做?这就是我对原始makefile所做的,但我更改了它,因为我认为我做错了什么。这是我的原始makefile:
COMP = gcc
CFLAGS = -fPIC -c -Wall
hw11FOUR: selena-4.o lib-selena.so
gcc -o hw11FOUR selena-4.o -lm ./lib-selena.so -ldl
selena-4.o: selena-4.c
$(COMP) $(CFLAGS) selena-4.c
lib-selena.so: selena-4.o
gcc -shared -o lib-selena.so selena-4.o