首页 > 解决方案 > 尝试针对共享对象进行编译时出现“ld: library not found”错误

问题描述

我正在尝试构建一个虚拟示例,其中一些源代码使用动态链接的库。为此,我有以下项目结构:

首先,我有一个“依赖”模块,我试图将它用作应该在其自己的文件中的通用代码提取,并且在创建共享对象时,应该包含在库中。

// dependency.h

int get_number();
// dependency.cpp
#include "dependency.h"


int get_number()
{
    return 5;
}

当然,我有一个“libnum”,其中包含必须由主代码运行的函数。

// libnum.h

int get_the_library_number();
// libnum.cpp

#include "dependency.h"

int get_the_library_number()
{
    return get_number() + 5;
}

最后我有了项目的“主要”代码

#include "libnum.h"

#include <iostream>

int main()
{
    std::cout << get_the_library_number() << std::endl;

    return 0;
}

注意:所有这些文件都放在同一个目录中。

但是,我正在努力让这一切正常工作并获得一个可执行./main文件。

从其他 Stack Overflow 问题中学习,我假设这是我应该做的:

  1. 首先我们为库创建一个目标文件:

    g++ -c libnum.cpp
    
  2. 我们现在从上一个命令 (libnum.o) 的输出中创建一个共享对象。因为我们有一个依赖,所以我们需要告诉编译器源代码的位置:

    g++ -shared libnum.o dependency.cpp -o libnum.so
    
  3. 最后,我们编译 main.cpp 显式地告诉链接器库所在的位置和它的名称。我们通过使用-L带有应该查找 .so 文件(当前目录)的目录的-l标志和带有不带 lib前缀的.so文件名的标志来做到这一点:

    g++ main.cpp -L. -lnum
    

我被困在这一步。链接器返回以下错误:

ld: library not found for -lnum
clang: error: linker command failed with exit code 1 (use -v to see invocation)

任何想法为什么会发生这种情况?

标签: c++g++

解决方案


推荐阅读