use*_*356 0 python boost dlopen boost-python
我的目标是使用boost python创建一个python扩展模块.问题是,当共享库中的代码使用dlopen访问同一个库中的符号时,它会失败(详情如下).看起来模块中的符号没有加载到python进程的符号表中
我在共享库myTest.so中有以下代码
// File 1
extern "C" void target_func() {
std::cout << "Works!" << std::endl;
}
// File 2
typedef void (*Func) ();
void run() {
void *handle = dlopen(0, RTLD_NOW | RTLD_GLOBAL)
Func *method = (Func *)dlsym(handle, "target_func");
// check if method is NULL and fail
}
Run Code Online (Sandbox Code Playgroud)
它包含在一个boost python模块中,如图所示 -
BOOST_PYTHON_MODULE(myTest) {
def("run", run);
}
Run Code Online (Sandbox Code Playgroud)
导入python模块并执行时,上面的代码失败
import myTest
myTest.run()
undefined symbol: target_func
Run Code Online (Sandbox Code Playgroud)
但是当我将myTest.so与调用run的main函数链接时,没有问题
int main(int argc, char **argv) {
run();
}
Output: Works!
Run Code Online (Sandbox Code Playgroud)
默认情况下,解释器不会以跨扩展名共享符号的方式加载扩展.这可以通过设置dlopen()解释器使用的标志来修改sys.setdlopenflags().文件说明:
要在扩展模块之间共享符号,请调用
sys.setdlopenflags(dl.RTLD_NOW | dl.RTLD_GLOBAL).
以下是使用默认设置加载扩展的解释器:
>>> import myTest
>>> myTest.run()
/usr/bin/python: undefined symbol: target_func
Run Code Online (Sandbox Code Playgroud)
修改解释器的dlopen()标志后会成功:
>>> import sys
>>> import dl
>>> sys.setdlopenflags(dl.RTLD_NOW | dl.RTLD_GLOBAL)
>>> import myTest
>>> myTest.run()
Works!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1246 次 |
| 最近记录: |