我正在尝试将 python 绑定添加到中等大小的 C++ 科学代码(数万个 LOC)。我设法让它在没有太多问题的情况下工作,但我现在遇到了一个我无法解决的问题。代码组织如下:
libcommon.acore.sopython模块“主要”部分的绑定工作正常。事实上,从独立代码或从 python 启动的模拟给出了完全相同的结果。
但是,该代码还支持类似插件的系统,该系统可以在运行时加载共享库。这些共享库包含从主代码中定义的接口继承的类。事实证明,如果我尝试从 python 链接这些共享库,我会收到臭名昭著的“未定义符号”错误。我已经检查过这些符号是否在core.so模块中(使用nm -D)。事实上,使用独立代码执行动态链接的模拟工作得很好(在同一文件夹中并使用相同的输入)。不知何故,共享库在通过 python 调用时找不到正确的符号,但在由独立代码加载时没有问题。我正在使用 CMake 来构建系统。
接下来是 MCE。复制文件夹中的每个文件,pybind11在同一位置复制(或链接)文件夹并使用以下命令:
mkdir build
cd build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)
这将生成一个standalone二进制文件和一个 python 模块。该standalone可执行文件将产生正确的输出。相比之下,在 python3 中使用以下命令(至少在我看来,应该是等效的)会产生错误:
mkdir build
cd build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)
#include "Base.h"
#include "plugin_loader.h"
#include <iostream>
int main() {
Base *d = load_plugin();
if(d == NULL) {
std::cerr << "No lib found" << std::endl; …Run Code Online (Sandbox Code Playgroud)