在Windows上使用pybind11编译C++代码后无法将.pyb / .dll文件导入Python

问题描述 投票:0回答:1

我的操作系统是Windows 10,我使用G++编译器,VS Code。我尝试将示例 pybind11 文件编译为 Python 对象。 C++ 代码如下所示:

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

namespace py = pybind11;

PYBIND11_MODULE(cmake_module, m) {
    m.def("add", &add, R"pbdoc(
        Add two numbers

        Some other explanation about the add function.
    )pbdoc");
};

为了编译项目,我使用 CMake 脚本:

cmake_minimum_required(VERSION 3.30.2)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic -shared")
set(CMAKE_CXX_FLAGS_DEBUG "-Werror -Og")

# Specify the path to pybind11 if it's not installed globally
set(PYBIND11_DIR "C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pybind11")

# Specify the path to the Python interpreter
set(PYBIND11_FINDPYTHON "C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python.exe")

# Find pybind11
find_package(pybind11 REQUIRED PATHS ${PYBIND11_DIR})

# Find Python components
find_package(Python COMPONENTS Interpreter Development REQUIRED)

# Include directories for Python headers
include_directories(${Python_INCLUDE_DIRS})

# Create the module
set(MODULE_NAME cmake_example)
pybind11_add_module(${MODULE_NAME} src/test.cpp)

成功构建文件后,我在构建文件夹中得到一个 cmake_example.cp312-win_amd64.pyd 文件。在这里,我运行

import cmake_example
,这会导致以下错误:
ImportError: DLL load failed while importing cmake_example: The specified module could not be found.

我使用Python 3.12.4,如果它有某种相关性的话。

我尝试解决问题:

  • 在 CMake 中提供了我的 Python 解释器的路径
  • 尝试了 os.add_dll_directory("path/to/build/dir")
  • 将编译好的.pyd文件移至“C:Users\User\AppData\Local\Programs\Python\Python312\DLLs”目录。
python c++ dll pybind11 pyd
1个回答
0
投票

将包含 MinGW 标准库(即

libgcc.dll
libstdc++.dll
)的文件夹添加到
PATH
环境变量中,它与包含
gcc.exe
g++.exe

的文件夹相同
© www.soinside.com 2019 - 2024. All rights reserved.