首先,这是一个编程任务,所以你知道.
无论如何,我想要做的是包括我写的共享库(来自前一个项目的链表)和我自己编写的shell.我发现的问题是,当我使用我的Makfile编译时,编译成功.然后当我尝试运行我的可执行文件时(让我们说它叫做prog),我得到以下内容:
[terminal]# ./prog
./prog: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
以下是我的文件结构供参考:
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
Run Code Online (Sandbox Code Playgroud)
这是我的主要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
Run Code Online (Sandbox Code Playgroud)
任何帮助或建议表示赞赏,谢谢!
运行时动态链接器不知道在哪里可以找到共享库.
两种选择:
设置LD_LIBRARY_PATH环境变量以包含lib目录的绝对路径:
LD_LIBRARY_PATH=/path/to/lib
export LD_LIBRARY_PATH
lib通过传递-R/path/to/lib给链接器(例如在makefile中,硬编码)可执行映像中目录的绝对路径CFLAGS=... -Llib -R/path/to/lib.
第一个选项是灵活的,因为共享库可以安装在任何地方甚至移动到另一个位置,只要环境变量相应更新,可执行文件就不会中断.但它确实要求用户(或系统管理员)必须正确设置环境.
第二个选项不允许从其预定义的安装目录中移动共享库,但会删除正确设置环境中的依赖项.
请注意,如果在标准系统特定位置(例如/ usr/lib或Unix/Linux上的/ usr/lib64)安装共享库,则无需执行任何操作,因为运行时链接程序将自动搜索此类位置.
| 归档时间: |
|
| 查看次数: |
2054 次 |
| 最近记录: |