链接器找不到本地共享库

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 的共享库。