【问题标题】:Makefile - cannot find shared libraryMakefile - 找不到共享库
【发布时间】:2013-02-25 10:25:01
【问题描述】:

我有一个 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 过程中不抱怨。

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

谢谢 马特

【问题讨论】:

    标签: c++ linux makefile


    【解决方案1】:
    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。在我看来,这是一个糟糕的建议,因为它使部署更加复杂。

    【讨论】:

    • 以后还是很有帮助的
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      确实,您的程序已与共享对象库链接。因此,在运行时,它需要加载这个共享对象文件。在编译期间,您使用-L 标志指示编译器此文件所在的位置。

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这对我有用,答案应该得到更多的支持
        【解决方案5】:

        刷新动态库缓存!

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

        然后,以动态链接库缓存刷新结束:

        $ sudo ldconfig
        

        【讨论】:

          猜你喜欢
          • 2015-07-28
          • 1970-01-01
          • 2010-10-27
          • 2017-10-21
          • 1970-01-01
          • 2014-06-13
          • 2016-06-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多