如何使用嵌入式 python 解释器 (pybind11) 构建和执行 cpp 文件

How to build and execute a cpp file with embedded python interpreter(pybind11)

我正在尝试寻找一种方法来使用 pybind11 构建和 运行 带有嵌入式 python 解释器的 cpp 文件。

this tutorial 开始,它使用 CMake,但我正在寻找一种无需 CMake 即可完成此操作的方法。

这是我试过的。

example.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
}

并且在终端中,当我 运行 以下内容时:(构建良好)

c++ -O3 -Wall -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example

然后 运行 二进制

./example

我收到以下错误:

dyld: Symbol not found: _PyBaseObject_Type Referenced from: /Users/cuinjune/Desktop/pybindtest/./example Expected in: flat namespace in /Users/cuinjune/Desktop/pybindtest/./example zsh: abort ./example

是否有任何可能的方法来使用 pybind11 使用嵌入式 python 解释器正确构建和执行 cpp 文件? (不使用 CMake)

Link 与 python 库一起定义了该符号(以及您需要的更多符号)。

假设是标准安装,那只不过是添加:

`-lpython`

到 CLI(或 -lpython3 等,如果您的系统上存在多个 python 库)。您也可以改为添加:

`python3-config --libs`

如果您的 python3 已安装 python3-config

编辑:根据评论,相关库目录对您设置中的链接器不可用。一种选择是改用全套标志:

`python3-config --ldflags`

我仍然假设 python3-config 与您的 python3 匹配。如果没有,则替代方法是获取目录 distutils。根据您的安装,在 -L 前面加上 -lpython-lpython3

-L`python3 -c 'import distutils.sysconfig as ds; print(ds.get_config_var("LIBDIR"))'` -lpython

(是的,还有一个 "LDFLAGS" config_var,但这些是构建 python 的标志,不太可能是您想要的。)