链接器找不到本地共享库
Linker cannot find local shared library
我正在尝试一个非常简单的示例来创建一个共享库并 link 到它。共享库如下:
#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
linker 假定文件名为
libX.so (or libX.a)
所以你想要的命令是:
> g++ -fPIC -shared -o libardugrab.so ardugrab.cpp
> # ^^^
> g++ -L. -lardugrab -o testardugrab testardugrab.cpp
注意:当标准库尝试查找和加载所需的共享库时,会在运行时使用环境变量 LD_LIBRARY_PATH
。 IE。在编译期间不使用它来查找 link 的共享库。
我正在尝试一个非常简单的示例来创建一个共享库并 link 到它。共享库如下:
#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
linker 假定文件名为
libX.so (or libX.a)
所以你想要的命令是:
> g++ -fPIC -shared -o libardugrab.so ardugrab.cpp
> # ^^^
> g++ -L. -lardugrab -o testardugrab testardugrab.cpp
注意:当标准库尝试查找和加载所需的共享库时,会在运行时使用环境变量 LD_LIBRARY_PATH
。 IE。在编译期间不使用它来查找 link 的共享库。