我正在尝试构建另一个程序将在运行时加载的共享库,但是当我在库上调用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; }
答案 0 :(得分:0)
错误是正确的。进行dlopen()
调用时,除非可以找到引用的每个符号,否则它不能返回成功的结果。因为一个符号位于主程序中,而不是库中,dlopen()
调用将无法加载主pgm,因此无法找到该符号的定义。
使用专用于主程序的代码的共享库的设计是一个基本问题,没有构建标志可以解决这个问题。我的建议是重新考虑设计 - 必须有更好的方法。