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中给出的路径指向保存共享对象的文件夹(相对于生成文件的位置(,如果路径错误,为什么在生成过程中没有抱怨。
有人知道我错过了什么吗?
谢谢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
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 项目 A 依赖共享库 B,B 依赖 C,A 不依赖 C。当我使用 B 的 API 时,警告 B 找不到 C
- 运行可执行文件时找不到共享库,即使共享库存在于指定的路径中
- Ogre 3D共享库与CMAKE链接时,在Linux上执行二进制时找不到
- Visual Studio共享库(Android,iOS)标题在Mac上找不到
- Qt应用程序在运行时找不到共享库
- CMAKE链接在Windows上共享库(LIB),但找不到DLL
- 在运行时找不到共享对象.克尔普克
- 即使定义了搜索路径,也找不到自定义共享库
- 我的交叉编译器找不到共享库
- 我可以在libleveldb.a中找到符号,但是当我创建共享库时,找不到相同的符号。
- SFML2 应用程序找不到共享对象
- Linux-找不到共享库
- GNU Linker 找不到本地共享库
- 将共享库与dlopen一起使用-共享对象找不到加载程序导出的符号
- 在交叉编译、Ubuntu到Beaglebone之后,在目标上找不到共享库
- C++/Eclipse共享库:为什么g++找不到这个库
- Ctypes 在使用 CMake 创建的共享库中找不到符号
- 即使我修改了LD_LIBRARY_PATH,也找不到我的共享库
- 在 Boost 中找不到共享库 (Linux Mint)