我尝试在C++中动态加载库。我遵循this教程。
我的文件夹结构是这样的:

├── main.cpp
├── testLib.cpp
├── testLib.h
├── testLib.so
└── testVir.h

main.cpp
#include<iostream>
#include<dlfcn.h>
#include<stdio.h>
#include "testVir.h"

using namespace std;

int main()
{
    void *handle;
    handle = dlopen("./testLib.so", RTLD_NOW);
    if (!handle)
    {
           printf("The error is %s", dlerror());
    }

    typedef TestVir* create_t();
    typedef void destroy_t(TestVir*);

    create_t* creat=(create_t*)dlsym(handle,"create");
    destroy_t* destroy=(destroy_t*)dlsym(handle,"destroy");
    if (!creat)
    {
           cout<<"The error is %s"<<dlerror();
    }
    if (!destroy)
    {
           cout<<"The error is %s"<<dlerror();
    }
    TestVir* tst = creat();
    tst->init();
    destroy(tst);
    return 0 ;
}

testLib.cpp
#include <iostream>
#include "testVir.h"
#include "testLib.h"

using namespace std;
void TestLib::init()
{
   cout<<"TestLib::init: Hello World!! "<<endl ;
}

//Define functions with C symbols (create/destroy TestLib instance).
extern "C" TestLib* create()
{
    return new TestLib;
}
extern "C" void destroy(TestLib* Tl)
{
   delete Tl ;
}

testLib.h
#ifndef TESTLIB_H
#define TESTLIB_H

class TestLib
{
 public:
     void init();
};

#endif

testVir.h
#ifndef TESTVIR_H
#define TESTVIR_H

class TestVir
{
public:
  virtual void init()=0;
};

#endif

我使用此命令获取testLib.sog++ -shared -fPIC testLib.cpp -o testLib.so
这工作正常,但是当我尝试使用g++ -ldl main.cpp -o test我得到这个错误:
/tmp/ccFoBr2X.o: In function `main':
main.cpp:(.text+0x14): undefined reference to `dlopen'
main.cpp:(.text+0x24): undefined reference to `dlerror'
main.cpp:(.text+0x47): undefined reference to `dlsym'
main.cpp:(.text+0x5c): undefined reference to `dlsym'
main.cpp:(.text+0x6c): undefined reference to `dlerror'
main.cpp:(.text+0x95): undefined reference to `dlerror'
collect2: error: ld returned 1 exit status

G++版本(来自g++ --version):g++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
我不知道要怎么做,我需要一些资源来学习它的工作原理。

编辑1
我通过使用此命令编译主程序解决了该问题。g++ main.cpp -ldl -o test。在此answer中找到此修复程序。

但是现在当我尝试运行./test时,我得到Segmentation fault。看来
在此行tst->init();,但指针看起来有效。

编辑2
this教程之后,我遇到了相同的错误Segmentation fault

如果您有很好的教程或文档,它将会真正有帮助。

最佳答案

这与dlopen部分无关。您的class TestLib缺少TestVir的继承:

class TestLib : public TestVir

您还应该将create / destroy签名固定为相同类型。由于要隐藏TestLib类,因此应返回并使用TestVir*
extern "C" TestVir* create()
{
    return new TestLib();
}
extern "C" void destroy(TestVir* Tl)
{
   delete Tl ;
}

还要将函数类型放在标题中,否则您将在一段时间后将自己摔倒。为此,您还必须have virtual destructor in the base class.
class TestVir
{
public:
    virtual void init()=0;
    virtual ~TestVir() = default; // note: C++11
};

顺便说一句:您的错误处理缺少刷新,并且在出现错误的情况下不应该继续进行。

关于c++ - 段错误和对 `dlopen'的 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36034269/

10-15 01:08