在运行时找不到链接库(c ++)

时间:2013-11-14 19:30:20

标签: c++ dll linker

我有以下makefile

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:无法打开共享对象文件:没有这样的文件或目录

这为我提出了几个问题:

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

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

非常感谢你的帮助:)。

1 个答案:

答案 0 :(得分:3)

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

  

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

或第二次显示你的搜索在哪里

  

export LD_LIBRARY_PATH = / absolut / path / to / libs

参数 -L 指定在链接时搜索链接器的其他路径; NOT 运行时到os。 -l <​​/ strong>指定链接器的其他库。