首页 > 解决方案 > 链接器找不到本地共享库

问题描述

我正在尝试一个非常简单的示例来创建一个共享库并链接到它。共享库如下:

#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 ++有点陌生,有人可以告诉我我做错了什么吗?

谢谢。

请注意,

尼尔

标签: c++linuxlinkershared-libraries

解决方案


这是因为您正在使用-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 在编译期间不使用它来查找要链接的共享库。


推荐阅读