c++ - 尝试针对共享对象进行编译时出现“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 问题中学习,我假设这是我应该做的:
首先我们为库创建一个目标文件:
g++ -c libnum.cpp
我们现在从上一个命令 (libnum.o) 的输出中创建一个共享对象。因为我们有一个依赖,所以我们需要告诉编译器源代码的位置:
g++ -shared libnum.o dependency.cpp -o libnum.so
最后,我们编译 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)
任何想法为什么会发生这种情况?
解决方案
推荐阅读
- java - 为什么 List.contains(Object) 的行为不同?
- r - 如何在同一个数据帧上做colsum和average
- powerbi - 使用 DAX 生成日期系列
- javascript - 仅在服务器上需要一个包
- java - Intellij IDEA 仅针对所有未提交的更改运行测试
- regex - 在换行符之前匹配字符,不包括空格?
- macos - MacOS - 使用带有launchd的脚本 - 启动,登录,注销,关闭?
- service-worker - Workbox 的服务人员在更改时未更新
- python - AllenNLP 共指分辨率的多 GPU 训练
- reactjs - 事件处理程序中带有 [name] 的 PrevState