首先,这是一个编程任务,所以你知道。
无论如何,我想要做的是包括我写的共享库(来自前一个项目的链表)和我自己编写的shell。我发现的问题是,当我使用我的Makfile编译时,编译成功。然后,当我尝试运行我的可执行文件时(让我们说它被称为prog),我得到以下内容:
[terminal]# ./prog
./prog: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
以下是我的文件结构供参考:
include
|_
common.h
List.h
Node.h
lib
|_
libmylib.a
libmylib.so
libsrc
|_
Makefile // This makefile builds the library correctly and puts it in lib via 'make install'
List.c
List.h
Node.c
Node.h
common.h
Makefile
prog.c
这是我的主要Makefile
CC=gcc
CFLAGS=-g -Wall -Llib
LIBS=-lreadline -lncurses -lmylib
PROGS=library prog
all: $(PROGS)
library:
cd libsrc; make install
prog: prog.o
$(CC) $(CFLAGS) -o $@ $< $(LIBS)
clean:
cd libsrc; make installclean
/bin/rm -f *.o $(PROGS) a.out core *.log
感谢任何帮助或建议,谢谢!
答案 0 :(得分:5)
运行时动态链接器不知道在哪里可以找到您的共享库。
两个选项:
设置LD_LIBRARY_PATH环境变量以包含lib
目录的绝对路径:
LD_LIBRARY_PATH=/path/to/lib
export LD_LIBRARY_PATH
通过将lib
传递给链接器(例如,在您的makefile -R/path/to/lib
中),对可执行映像中CFLAGS=... -Llib -R/path/to/lib
目录的绝对路径进行硬编码。
第一个选项是灵活的,因为共享库可以安装在任何地方甚至移动到另一个位置,只要环境变量相应更新,可执行文件就不会中断。但它确实要求用户(或系统管理员)必须正确设置环境。
第二个选项不允许从预定义的安装目录中移动共享库,但会删除正确设置环境中的依赖项。
请注意,如果您将共享库安装在标准系统特定位置(例如/ usr / lib或Unix / Linux上的/ usr / lib64),则不需要执行任何操作,因为运行时链接程序将搜索这些地点会自动生效。