2014-10-01 43 views
0

首先,这是一个编程任务,所以你知道。C共享库:在执行时没有这样的文件或目录

无论如何,我想要做的是包括我写的共享库(来自以前项目的链接列表)与我自己的shell。我遇到的问题是,当我使用我的Makfile进行编译时,编译成功。然后,当我尝试运行我的可执行文件(让我们说这就是所谓的前卫),我得到如下:

[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 [email protected] $< $(LIBS) 

clean: 
    cd libsrc; make installclean 
    /bin/rm -f *.o $(PROGS) a.out core *.log 

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

+0

顺便说一句 - 通过所有的实际编译和只是遇到运行时问题的荣誉。 – 2014-10-01 19:58:55

回答

5

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

两个选项:

  1. 设置PATH环境变量,包括你的lib目录的绝对路径:

    LD_LIBRARY_PATH=/path/to/lib

    export LD_LIBRARY_PATH

  2. 硬编码的绝对路径到您的exec中的lib目录通过将-R/path/to/lib传递给链接器(例如,在你的makefile中,CFLAGS=... -Llib -R/path/to/lib

第一种选择是灵活的,在这个意义上,共享库可以安装在任何地方,甚至移动到其它位置,只要环境变量进行相应的更新可执行文件不会打破。但它确实要求用户(或系统管理员)必须正确设置环境。

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

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

+0

或者,将/ path/to/lib添加到'/ etc/ld.so.conf'并运行'ldconfig'。但是,正如@isedev指出的那样,这需要root。 – 2014-10-01 19:55:51

+0

@isedev谢谢。我用成功的选项1和2。我尝试了使用系统特定位置的最后一个选项,但我无法得到它的工作,但我认为选项2对于如何将此任务转换为最佳。再次感谢! – 2014-10-01 20:13:07

相关问题