【问题标题】:Linked library not found at run-time (c++)在运行时找不到链接库(C++)
【发布时间】:2013-11-14 19:30:20
【问题描述】:

我有以下生成文件

FLAGS = -g -c -Wall -Wextra -O2 -pedantic -Werror
CC = g++
SOURCE = $(wildcard src/*.cpp)
INTERM = $(patsubst %.cpp,%.o,$(SOURCE))
OBJECTS = $(patsubst src/%,nbobj/%,$(INTERM))
RES = app
INCLUDE = -I../../libs
OPENCV = -L/usr/local/lib `pkg-config --cflags --libs opencv`
LINK =  -L./../../libs -lgstd  $(OPENCV)


$(RES): $(OBJECTS)
    $(CC) $(OBJECTS) -o $(RES) $(LINK)

nbobj/%.o: src/%.cpp 
    $(CC) $(FLAGS) $(INCLUDE) -o $@ -c $<

clean:
    rm -rf $(RES) $(OBJECTS) 

它编译得很好,但是当我运行程序时,我得到了

加载共享库时出错:libgstd.so: cannot open shared object file: No such file or directory

这向我提出了几个问题:

  • libgstd 是在编译时明确发现的(如果我删除了 -lgstd,程序不会编译),并且当我运行程序时 .so 没有移动。怎么突然找不到了?
  • 我已经阅读了很多帖子说我需要修改 ld.conf。我认为 -L 标志的目的是为了避免这种情况。我真的不想为我写的一个小库修改系统文件。此外,我想将可执行文件和 libgstd 一起放在一个文件夹中,而不是通过弄乱系统文件来强迫任何人“安装”libgstd
  • 我还读到 -R 标志在运行时等效于 -L,但如果我使用 -R 编译,编译器会显示“错误:无法识别的选项‘-R’”

此外,我遇到了一个类似的问题,我有一个包含对“clock_gettime”调用的库。它编译得很好,但是在运行时,当我使用该库中的函数时,我得到“未定义的对 `clock_gettime' 的引用”。为什么我编译库的时候,链接器明明找到了clock_gettime,但是当我使用库的时候,即使没有文件被移动,也找不到?

非常感谢您的帮助:)

【问题讨论】:

  • 感谢您的回复。如果不告诉链接器在目录中搜索,-L 标志会做什么?为什么在查找库方面编译时和运行时之间存在差异?

标签: c++ dll linker


【解决方案1】:

在启动程序时,操作系统找不到要加载的库,尤其是它甚至不知道在哪里搜索,因为 ./../../libs 不是它要搜索的路径。你可以做两件事。首先,将 lib 移动到它将搜索的文件夹(取决于您的系统)

/lib/ 或 /lib64/ 或 /usr/lib 或 ...

或者第二个显示你的操作系统在哪里搜索

导出 LD_LIBRARY_PATH=/absolut/path/to/libs

-L 参数指定在链接时搜索链接器的附加路径; NOT 在操作系统运行时。 -l 为链接器指定额外的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多