我正在尝试让 pybind11 在 Windows 中工作。我已经使用 conda-forge 安装了 pybind11,然后执行最简单的代码:
#include "pybind11/pybind11.h"
namespace py = pybind11;
用 :
g++ -std=c++17 -O2 -mavx -IC:/Users/beng_/anaconda3/Lib/site-packages/pybind11/include -IC:/Users/beng_/anaconda3/include/pybind11_global/ -IC:/Users/beng_/anaconda3/include/ - pb_test.cpp -o pb_test
编译它: -I 路径避免了早期未找到 Python.h 的问题。但现在,我收到了一堆与未定义引用“_ imp_Py*”类型的错误相关的错误。太多了,数不过来。我的猜测是我缺少链接器,经过一番搜索,建议的提示似乎涉及 /anaconda3/libs 文件夹以及所有 dll。如果我尝试 -lc:/Users/beng
cannot find -lC:/Users/beng_/anaconda3/libs/python311
collect2.exe: error: ld returned 1 exit status
/anaconda3/libs/python311 或 python3,则它们都不起作用。相反,它会抱怨:
但是 python3.dll 和 python311.dll 都在该文件夹中。 我已经检查了类似的帖子,但到目前为止没有任何帮助我:
Pybind11 错误未定义对“Py_GetVersion”的引用
在链接 Python 库时遇到问题。 让我们逐步解决这个问题:
理解问题
错误信息“undefined reference to
_imp_PyGILState_Check'” 以及其他类似错误表明,的 C++ 编译器在编译后的代码中找不到必要的 Python 函数定义。 这些定义通常位于 Python 库文件 (例如
python311.lib` on Windows) 中。
解决方案
-
找到 Python 库文件:
-
需要找到与的 Anaconda 环境相匹配的
python311.lib
文件。 它通常位于 Anaconda 安装目录的libs
文件夹中,例如C:\Users\beng_\anaconda3\libs
。 -
链接 Python 库:
-
将以下内容添加到的 g++ 命令中,用的实际 Anaconda 安装路径替换
C:\Users\beng_\anaconda3
:bash g++ -std=c++17 -O2 -mavx -IC:/Users/beng_/anaconda3/Lib/site-packages/pybind11/include -IC:/Users/beng_/anaconda3/include/pybind11_global/ -IC:/Users/beng_/anaconda3/include/ -LC:/Users/beng_/anaconda3/libs pb_test.cpp -o pb_test -lpython311
-
-LC:/Users/beng_\anaconda3/libs
告诉编译器在哪里查找库文件。 -
-lpython311
告诉编译器链接python311.lib
。
其他提示
-
确保使用正确的 Python 版本:
的代码和链接的 Python 库版本必须匹配。 如果使用的是 Anaconda 环境中的 Python 3.11,则需要链接
python311.lib
。 -
检查环境变量:
确保的环境变量(例如
PATH
)正确设置为的 Anaconda 环境。 - 使用 CMake: 对于更复杂的项目,使用 CMake 可以更容易地管理构建过程和依赖项。 Pybind11 提供了 CMake 集成,可以自动找到并链接正确的 Python 库。
示例 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.4)
project(MyProject)
find_package(pybind11 REQUIRED)
add_executable(pb_test pb_test.cpp)
target_link_libraries(pb_test PRIVATE pybind11::embed)
通过正确链接 Python 库,应该能够解决 “undefined reference” 错误并成功构建的 Pybind11 项目。
标签:python,c++,pybind11 From: 78803628