2013-02-25 138 views
4

我有一个Makefile对于C++ Linux项目:Makefile文件 - 无法找到共享库

MODE ?= dbg 
DIR = ../../../../../somdir/$(MODE) 

SRC_FILES = a.cpp b.cpp 
H_FILES = a.h 

LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN' 
CPPFLAGS = -I$(DIR)/include 
LIBRARIES = -lsomeso 

ifeq (rel, $(MODE)) 
    CFLAGS = -Wall -g -DNDEBUG 
else 
    CFLAGS = -Wall -ansi -pedantic -Wconversion -g -DDEBUG -D_DEBUG 
endif 

sample: $(SRC_FILES) $(H_FILES) Makefile 
    g++ $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LIBRARIES) $(SRC_FILES) -o sample 

当我运行“制作”它建立项目,没有任何错误。 但是当我运行该项目,它抱怨说:

error while loading shared libraries: libsomeso.so: cannot open shared object file: No such file or directory 

,我给在DIR路径去共享对象举行(相对到makefile文件被放置)的文件夹,如果它是为什么在制作过程中没有抱怨?

有人知道我错过了什么吗?

感谢 马特

回答

3
LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN' 

上面的应该是:

LDFLAGS += -L$(DIR)/lib/linux -Wl,-R$(DIR)/lib/linux '-Wl,-R$$ORIGIN' 

也就是说,对于每个非标准动态库的位置-L相应-Wl,-R应该被指定。需要$ORIGIN来定位动态库相对于可执行文件,不知道你是否需要它在这里。

人们经常会推荐使用LD_LIBRARY_PATH。在我看来,这是一个不好的建议,因为它会使部署更加复杂。

2

当你运行你的应用程序中,libsomeso.so位置应在LD_LIBRARY_PATH环境变量。试运行的程序是这样的:

LD_LIBRARY_PATH="path_to_libsomeso_so:$LD_LIBRARY_PATH" myprogram 

这里path_to_libsomeso_so是一个目录其中libsomeso.so所在完整路径,myprogram是你的可执行程序。请注意,您应该指定包含libsomeso.so的目录的路径,而不是libsomeso.so文件本身。

1

麻烦不在编译期间。一切都很好。运行时出现问题。

的确,您的程序已经与共享对象库链接。因此,在运行时,它需要加载这个共享对象文件。在编译过程中,您将指示编译器在-L标志处的文件所在的位置。

对于运行时,您必须将LD_LIBRARY_PATH环境变量设置为指向libsomeso.so文件所在的目录。

或者,你可以把这个文件在这些共享的目标文件中搜索标准目录之一:/usr/local/lib/usr/lib/lib,但是这应该是你会为你的库的最终分布式版本做什么。

0

正如Maxim Egorushkin所说,LD_LIBRARY_PATH是一个不错的选择。同时,使用-L$(your lib path) -l$(your lib name) gcc/g ++参数来链接共享库不是一个好的选择。因为在构建exe文件之后,你应该告诉exe共享库目录在哪里。默认情况下,可执行文件仅在/usr/lib/usr/local/lib搜索共享库。虽然,您已经告诉makefile生成可执行文件时共享库的位置。但是当你执行这个exe文件时,它们是不同的。 但是,链接静态库没有这样的问题。

因此,处理您的问题的最好方法是改变您链接自定义共享文件的方式。像这样:

DYNAMIC_LIB_DIR = ../lib (your lib path ,this is a example) 

OBJLIBS = xxx.so (your lib name) 

gcc/g++ -o exe_name sourcefile/object_file $(DYNAMIC_LIB_DIR)/$(OBJLIBS) 
0

刷新动态库缓存!

将自定义非标准库添加到/usr/local/lib后,首先检查/usr/local/lib是否在/etc/ld.so.conf.d/libc.conf下面列出。

然后,玩完一个动态连接库缓存刷新:

$ sudo ldconfig