繁体   English   中英

Makefile - 找不到共享库

[英]Makefile - cannot find shared library

我有一个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中提供的路径转到保存共享对象的文件夹(相对于放置makefile的位置),如果它是错误的路径,为什么它不会在make过程中抱怨。

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

谢谢马特

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添加自定义非标准库后,首先检查/etc/ld.so.conf.d/libc.conf下是否列出了/usr/local/lib

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

$ sudo ldconfig

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM