Zac*_*Lee 4 c++ python pybind11
我正在尝试找到一种使用 pybind11 构建和运行带有嵌入式 python 解释器的 cpp 文件的方法。
在本教程中,它使用 CMake,但我正在寻找一种无需 CMake 即可完成此操作的方法。
这是我尝试过的。
在示例.cpp中:
#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;
int main() {
py::scoped_interpreter guard{}; // start the interpreter and keep it alive
py::print("Hello, World!"); // use the Python API
}
Run Code Online (Sandbox Code Playgroud)
当我运行以下命令时,在终端中:(构建良好)
c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example
Run Code Online (Sandbox Code Playgroud)
然后运行二进制文件
./example
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
dyld:未找到符号:_PyBaseObject_Type 引用自:/Users/cuinjune/Desktop/pybindtest/./example 预期位置:/Users/cuinjune/Desktop/pybindtest/./example 中的平面命名空间 zsh:中止 ./example
有没有可能的方法可以使用 pybind11 正确构建和执行带有嵌入式 python 解释器的 cpp 文件?(不使用 CMake)
与 python 库链接,该库定义了该符号(以及您需要的更多符号)。
假设采用标准安装,则只需添加:
`-lpython`
Run Code Online (Sandbox Code Playgroud)
到 CLI(或者-lpython3等等,如果您的系统上存在多个 python 库)。您也可以添加:
`python3-config --libs`
Run Code Online (Sandbox Code Playgroud)
如果你的python3已经python3-config安装了。
编辑:根据评论,相关的库目录不可用于您设置中的链接器。一种选择是使用完整的标志集:
`python3-config --ldflags`
Run Code Online (Sandbox Code Playgroud)
我仍然假设python3-config与你的python3. 如果没有,则另一种方法是获取目录 distutils。根据您的安装添加或-L添加前缀:-lpython-lpython3
-L`python3 -c 'import distutils.sysconfig as ds; print(ds.get_config_var("LIBDIR"))'` -lpython
Run Code Online (Sandbox Code Playgroud)
(是的,还有一个“LDFLAGS”config_var,但这些是用于构建 python 的标志,不太可能是您想要的。)