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

时间:2014-10-01 19:46:55

标签: 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

以下是我的文件结构供参考:

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

感谢任何帮助或建议,谢谢!

1 个答案:

答案 0 :(得分:5)

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

两个选项:

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

    LD_LIBRARY_PATH=/path/to/lib

    export LD_LIBRARY_PATH

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

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

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

    请注意,如果您将共享库安装在标准系统特定位置(例如/ usr / lib或Unix / Linux上的/ usr / lib64),则不需要执行任何操作,因为运行时链接程序将搜索这些地点会自动生效。