[英]Linker cannot find local shared library
我正在嘗試一個非常簡單的示例來創建一個共享庫並鏈接到它。 共享庫如下:
#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 在編譯期間不使用它來查找要鏈接的共享庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.