dlopen 在实例化对象的库中失败
dlopen fails in a library instantiating an object
我们有一个 dlopen 的最小工作示例。
void* lib = dlopen("servlets.so", RTLD_NOW);
void* p = dlsym(lib, "getServlets");
但是,如果我们将另一个函数添加到共享库(即使它被调用也不行),那么该库将不起作用(即使代码从未被调用)
uint32_t count = 0;
Servlet** servlets;
extern "C" {
void generate() {
servlets = new Servlet*[3];
servlets[0] = new Servlet(...);
}
Servlet** getServlets() { return servlets; }
uint32_t getServletNum() { return count; }
}
这一定是因为共享对象中的代码引用了一些我们没有的符号,但我们不知道是什么。
代码编译 links 没有问题。
有什么方法可以查出错误是什么?没有报错,只是库指针returnsNULL,库没有加载
我们如何 link 到库以便 dlopen 工作?
No error is reported, except that the library pointer returns NULL
库指针不能return任何东西。你可能是说 dlopen()
returns NULL
.
如果这就是您的意思,那就是报告的错误。如果您想进一步了解 为什么 错误是 returned,请使用 dlerror()
找出答案。
我们有一个 dlopen 的最小工作示例。
void* lib = dlopen("servlets.so", RTLD_NOW);
void* p = dlsym(lib, "getServlets");
但是,如果我们将另一个函数添加到共享库(即使它被调用也不行),那么该库将不起作用(即使代码从未被调用)
uint32_t count = 0;
Servlet** servlets;
extern "C" {
void generate() {
servlets = new Servlet*[3];
servlets[0] = new Servlet(...);
}
Servlet** getServlets() { return servlets; }
uint32_t getServletNum() { return count; }
}
这一定是因为共享对象中的代码引用了一些我们没有的符号,但我们不知道是什么。 代码编译 links 没有问题。
有什么方法可以查出错误是什么?没有报错,只是库指针returnsNULL,库没有加载
我们如何 link 到库以便 dlopen 工作?
No error is reported, except that the library pointer returns NULL
库指针不能return任何东西。你可能是说 dlopen()
returns NULL
.
如果这就是您的意思,那就是报告的错误。如果您想进一步了解 为什么 错误是 returned,请使用 dlerror()
找出答案。