Makefile – 找不到共享库

我有一个C ++ Linux项目的Makefile:

MODE ?= dbg DIR = ../../../../../somdir/$(MODE) SRC_FILES = a.cpp b.cpp H_FILES = ah 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 

当我运行'make'它build立了项目,没有错误。 但是当我运行该项目,它抱怨说:

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

我在DIR中给出的path转到共享对象所在的文件夹(相对于makefile的放置位置),如果是错误的path,为什么在make过程中没有抱怨呢?

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

谢谢Matt

Solutions Collecting From Web of "Makefile – 找不到共享库"

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

以上应该是:

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

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

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

运行应用程序时, libsomeso.so位置应该位于LD_LIBRARY_PATH环境变量中。 尝试像这样运行程序:

 LD_LIBRARY_PATH="path_to_libsomeso_so:$LD_LIBRARY_PATH" myprogram 

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

麻烦不在编译期间。 一切顺利。 运行时出现问题。

事实上,你的程序已经与一个共享对象库链接。 因此,在运行时,它需要加载这个共享目标文件。 在编译期间,您将指示编译器在哪里使用-L标志。

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

或者,您可以将这个文件放在这些共享目标文件的标准目录中: /usr/local/lib/usr/lib/lib ,但是这应该是最后一次分发你的图书馆的版本。

正如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) 

刷新动态库缓存!

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

然后,用动态链接库缓存刷新完成:

 $ sudo ldconfig