来自dlopen的未定义符号错误

时间:2016-01-01 19:55:14

标签: c++

我正在尝试构建另一个程序将在运行时加载的共享库,但是当我在库上调用undefined symbol error时,我得到dlopen()。缺少的符号是在我的程序构建的主项目中定义的函数(称为foo_func)(并在主程序中使用),并且我将其头部包含在共享库定义中。

根据stackoverflow上的其他帖子,我尝试使用-fPIC和-shared标志来构建我的库,并使用-rdynamic -ldl来构建我的主程序,但仍然得到错误。图书馆大致看起来像这样。什么想法可能是错的?

#include <header where foo_func is defined>
class foo {
  public:
    foo() {x=0;}
    virtual void init(){};
    double x;  
};
class bar: public foo{
  public:
    void init() {
        foo_func(...)
    }
};
extern "C" foo* create() { return new bar; }

1 个答案:

答案 0 :(得分:0)

错误是正确的。进行dlopen()调用时,除非可以找到引用的每个符号,否则它不能返回成功的结果。因为一个符号位于主程序中,而不是库中,dlopen()调用将无法加载主pgm,因此无法找到该符号的定义。

使用专用于主程序的代码的共享库的设计是一个基本问题,没有构建标志可以解决这个问题。我的建议是重新考虑设计 - 必须有更好的方法。