Makefile-找不到共享库

Makefile - cannot find shared library

本文关键字:共享 找不到 Makefile-      更新时间:2023-10-16

我有一个用于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

当我运行"make"时,它构建了项目,没有任何错误。但当我运行该项目时,它抱怨道:

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

我在DIR中给出的路径指向保存共享对象的文件夹(相对于生成文件的位置(,如果路径错误,为什么在生成过程中没有抱怨。

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

谢谢Matt

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

运行应用程序时,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文件本身的路径。

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

事实上,您的程序已经链接到了一个共享对象库。因此,在运行时,它需要加载这个共享对象文件。在编译过程中,您使用-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