C++ 来自dlopen的未定义符号错误

C++ 来自dlopen的未定义符号错误,c++,C++,我试图构建一个共享库,另一个程序将在运行时加载该库,但在调用库上的dlopen()时,我遇到了undefined symbol错误。缺少的符号是一个函数(称之为foo_func),该函数是在生成我的程序的主项目中定义的(并且也在主程序中使用),我将其头包含在共享库定义中 基于stackoverflow上的其他文章,我尝试使用-fPIC和-shared标志来构建我的库,使用-rdynamic-ldl来构建我的主程序,但仍然出现了错误。图书馆大致是这样的。有什么想法吗 #include <he

我试图构建一个共享库,另一个程序将在运行时加载该库,但在调用库上的
dlopen()
时,我遇到了
undefined symbol错误。缺少的符号是一个函数(称之为
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; }
#包括
福班{
公众:
foo(){x=0;}
虚拟void init(){};
双x;
};
分类栏:公共食品{
公众:
void init(){
富富丰(…)
}
};
extern“C”foo*create(){返回新条;}

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


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

用于查看.so共享库中定义的符号。如果您发现“foo_func()”,那么您的客户机将错误地调用它。也许您缺少了一个“extern C”,也许您将它作为一个独立函数而不是类成员来调用——有很多可能性。从“nm”开始,然后从那里开始工作。很难说给定的
是任何人都无法尝试和编译的。请构建一个MVCE。请编辑您的问题,给出实际涉及的符号,解释它们在哪些文件中声明和定义,并给出确切的声明和定义。给出确切的消息和
dlerror()
的值当某些东西出现故障时,我不同意,大多数插件都使用来自主程序的代码(程序
dlopen
-ing)。特别是GCCplugins@BasileStarynkevitch你是说通过指针/回调/入口点?这种技术很好,但我不熟悉直接链接。不,GCC插件将调用来自GCC的函数。Eg正在调用内部定义的
ggc_collect
GCC@BasileStarynkevitch我可以查看是否加载了程序(如gcc),然后为这样的库调用
dlopen()
——应该解析符号。但是如果不先加载程序,我看不出
dlopen()
如何才能成功。您确定加载插件时未加载
gcc
吗?另外,至少在Linux上,
dlopen
带有
NULL
路径正在访问主程序的符号