Makefile-找不到共享库 我有一个C++ Linux项目的MaxFix: 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

Makefile-找不到共享库 我有一个C++ Linux项目的MaxFix: 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,c++,linux,makefile,C++,Linux,Makefile,当我运行“make”时,它会生成项目,没有错误。 但当我运行该项目时,它抱怨: error while loading shared libraries: libsomeso.so: cannot open shared object file: No such file or directory 我在DIR中给出的路径指向保存共享对象的文件夹(相对于放置makefile的位置),如果路径错误,为什么在make过程中它没有抱怨 有人知道我错过了什么吗 谢谢 Matt运行应用程序时,libsom

当我运行“make”时,它会生成项目,没有错误。 但当我运行该项目时,它抱怨:

error while loading shared libraries: libsomeso.so: cannot open shared object file: No such file or directory
我在DIR中给出的路径指向保存共享对象的文件夹(相对于放置makefile的位置),如果路径错误,为什么在make过程中它没有抱怨

有人知道我错过了什么吗

谢谢
Matt

运行应用程序时,
libsomeso.so
的位置应该在
LD\u LIBRARY\u PATH
环境变量中。试着像这样运行程序:

LD_LIBRARY_PATH="path_to_libsomeso_so:$LD_LIBRARY_PATH" myprogram

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

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

事实上,您的程序已经链接到一个共享对象库。因此,在运行时,它需要加载此共享对象文件。在编译过程中,使用
-L
标志指示编译器此文件所在的位置

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

或者,您可以将此文件放在搜索这些共享对象文件的标准目录中:
/usr/local/lib
/usr/lib
/lib
,但这应该是您对库的最终分发版本所做的操作

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\u LIBRARY\u PATH
。在我看来,这是一个糟糕的建议,因为它使部署更加复杂

正如Maxim Egorushkin所说,
LD_LIBRARY_PATH
是一个糟糕的选择。同时,使用
-L$(您的库路径)-L$(您的库名称)
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

这对我很有用,答案应该会得到更多的选票