簡體   English   中英

Linker 找不到本地共享庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM