C共享库:执行时没有此类文件或目录

Jas*_*dly 0 c linux makefile

首先,这是一个编程任务,所以你知道.

无论如何,我想要做的是包括我写的共享库(来自前一个项目的链表)和我自己编写的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)

任何帮助或建议表示赞赏,谢谢!

ise*_*dev 5

运行时动态链接器不知道在哪里可以找到共享库.

两种选择:

  1. 设置LD_LIBRARY_PATH环境变量以包含lib目录的绝对路径:

    LD_LIBRARY_PATH=/path/to/lib

    export LD_LIBRARY_PATH

  2. lib通过传递-R/path/to/lib给链接器(例如在makefile中,硬编码)可执行映像中目录的绝对路径CFLAGS=... -Llib -R/path/to/lib.

第一个选项是灵活的,因为共享库可以安装在任何地方甚至移动到另一个位置,只要环境变量相应更新,可执行文件就不会中断.但它确实要求用户(或系统管理员)必须正确设置环境.

第二个选项不允许从其预定义的安装目录中移动共享库,但会删除正确设置环境中的依赖项.

请注意,如果在标准系统特定位置(例如/ usr/lib或Unix/Linux上的/ usr/lib64)安装共享库,则无需执行任何操作,因为运行时链接程序将自动搜索此类位置.