c++ - 链接器找不到本地共享库
问题描述
我正在尝试一个非常简单的示例来创建一个共享库并链接到它。共享库如下:
#ifndef ARDUGRAB_H_
#define ARDUGRAB_H_
#include <iostream>
using namespace std;
namespace ArduGrabLibrary{
class ArduGrab{
public:
ArduGrab();
virtual void initCamera();
virtual void setSim(bool sim);
virtual void setDebug(bool debug);
private:
bool debug = false;
bool sim = false;
};
}
那么源代码文件就这么简单:
#include "ardugrab.h"
namespace ArduGrabLibrary
{
ArduGrab::ArduGrab(){
std::cout << "IMX298 Constructor" << std::endl;
}
void ArduGrab::initCamera(){
if (this->debug){
cout << "init camera" << std::endl;
}
}
void ArduGrab::setSim(bool sim){
this->sim = sim;
if (this->debug){
cout << "set sim to " << std::boolalpha << this->sim << std::endl;
}
}
void ArduGrab::setDebug(bool debug){
this->debug = debug;
if (this->debug){
cout << "set debug to " << std::boolalpha << this->sim << std::endl;
}
}
}
然后我将它编译成一个共享库:
g++ -fPIC -shared -o ardugrab.so ardugrab.cpp
很好,我们得到了一个 ardgrab.so 库,以便对其进行测试,在与上面的 .so 和 .h 文件相同的目录中使用以下代码:
#include "ardugrab.h"
using namespace ArduGrabLibrary;
int main() {
std::cout << "starting program" << std::endl;
ArduGrab* ardu = new ArduGrab();
ardu->setDebug(true);
//imx298->setSim(true);
//imx298->initCamera();
return 0;
}
所以现在我们需要将它编译成一个可执行文件:
g++ -L. -lardugrab -o testardugrab testardugrab.cpp
但是,这找不到 ardugrab.so 文件,出现以下错误消息:
pi@raspberrypi:~/ArduMipiGrab $ g++ -L. -lardugrab -o testardugrab testardugrab.cpp
/usr/bin/ld: cannot find -lardugrab
collect2: error: ld returned 1 exit status
我尝试将 LD_LIBRARY_PATH 设置为 . 导出 LD_LIBRARY_PATH=。但仍然没有。
如您所见,我对编译c ++有点陌生,有人可以告诉我我做错了什么吗?
谢谢。
请注意,
尼尔
解决方案
这是因为您正在使用-l
标志。
当你使用这个标志(而不是专门指定一个库)时,它假定一个特定的命名约定。
-lX
链接器假定文件名是
libX.so (or libX.a)
所以你想要的命令是:
> g++ -fPIC -shared -o libardugrab.so ardugrab.cpp
> # ^^^
> g++ -L. -lardugrab -o testardugrab testardugrab.cpp
注意:LD_LIBRARY_PATH
当标准库尝试查找和加载所需的共享库时,会在运行时使用环境变量。IE 在编译期间不使用它来查找要链接的共享库。
推荐阅读
- android - 为什么我的 Android 应用程序中的应用程序中心对话框不再显示下载按钮?
- slack - 如何从私人 Slack 频道获取会员?
- angular - Angular - 数据路径“”不应具有其他属性(allowedCommonJsDependencies)
- python - Python 如何管理整数和浮点数的大小?
- python - 如何从fastapi中的另一个api调用一个api?
- r - read_excel 无法读取 xls(MS excel 5.0/95 工作簿),但可以通过另存为 .xlsx 读取
- javascript - 使用对象克隆方法和for循环将对象推入数组,对象仍然是相同的引用,并且在数组中是相同的
- javascript - React + Socket IO:访问第一条消息
- email - 允许对 SQL 数据库进行邮件传递
- image - 用于 JasperReport 中的图像的 Samba 共享