我有一个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的位置),如果是错误的路径,为什么它在make过程中没有抱怨。
有人知道我错过了什么吗?
由于 马特
答案 0 :(得分:5)
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
。在我看来,这是一个糟糕的建议,因为它使部署更加复杂。
答案 1 :(得分: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
文件本身。
答案 2 :(得分:1)
麻烦不在编译期间。一切都很顺利。运行时出现问题。
确实,您的程序已与共享对象库链接。因此,在运行时,它需要加载此共享对象文件。在编译期间,您将指示编译器此文件带有-L
标志的位置。
对于运行时,您必须将LD_LIBRARY_PATH
环境变量设置为指向libsomeso.so
文件所在的目录。
或者,您可以将此文件放在搜索这些共享对象文件的标准目录之一:/usr/local/lib
,/usr/lib
,/lib
,但这应该是您的'我将为您的库的最终分发版本做。
答案 3 :(得分: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)
答案 4 :(得分:-1)
向/usr/local/lib
添加自定义非标准库后,请先检查/usr/local/lib
下是否列出/etc/ld.so.conf.d/libc.conf
。
然后,使用动态链接库缓存刷新完成:
$ sudo ldconfig