Заголовок оболочки C++ (packageext.h)
Код: Выделить всё
#ifndef PACKAGEEXT_H
#define PACKAGEEXT_H
#include "package.h" // from the dynamic library
class PackageExt {
public:
PackageExt(const std::string &id);
PackageExt(const ContainerCore::Package &pkg);
PackageExt(const PackageExt &other);
PackageExt& operator=(const PackageExt &other);
~PackageExt();
void setPackageID(const std::string &id);
std::string packageID() const;
ContainerCore::Package* getBasePackage();
private:
ContainerCore::Package *mPackage; // Defined in the dynamic library
};
#endif // PACKAGEEXT_H
Код: Выделить всё
#include
#include
#include "packageext.h"
namespace py = pybind11;
PYBIND11_MODULE(ContainerPy, m) {
m.doc() = "Pybind11 plugin for Container library";
py::class_(m, "Package")
.def(py::init(), py::arg("id"),
"Constructor that initializes a Package with the specified ID.")
.def("get_package_id", &PackageExt::packageID,
"Get the package ID as std::string.")
.def("set_package_id", &PackageExt::setPackageID, py::arg("id"),
"Set the package ID using std::string.");
}
Код: Выделить всё
find_package(Python REQUIRED COMPONENTS Interpreter Development)
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core Concurrent Xml Network Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Concurrent Xml Network Sql)
find_package(pybind11 REQUIRED CONFIG HINTS ${PYBIND11_HINTS_PATH})
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(BINDING_FILES
bindcontainer.cpp
containerext.cpp
packageext.cpp
containermapext.cpp
)
pybind11_add_module(${PYTHON_LIB_NAME} MODULE ${BINDING_FILES})
target_link_libraries(${PYTHON_LIB_NAME} PRIVATE Container) # Dynamic library
target_link_libraries(${PYTHON_LIB_NAME} PRIVATE Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Xml Qt6::Sql)
target_link_libraries(${PYTHON_LIB_NAME} PRIVATE Python::Python)
После сборки модуля я успешно получаю файл .pyd. Однако когда я импортирую модуль в Python и проверяю его, я вижу следующее:
python
Код: Выделить всё
import ContainerPy
print(dir(ContainerPy))
The output is:
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
Дополнительные сведения:
- Я использую Qt6 с pybind11 для оболочки класса C++.
- Динамическая библиотека компонуется правильно, ошибок сборки нет.
- Моя среда настроена на использование CMake для сборки проекта.
- Я проверил, что файл .pyd создается, но привязки классов, похоже, не видны в Python.
- файл pyd ContainerPy/ContainerPy.cpython-313-x86_64-linux-gnu.so установлен в папке site-packages в моей среде Python. .
- Я создаю его в Linux, но код также можно собрать и в Windows/Macos.
- Я гарантировал, что конфигурация CMake связана с необходимыми компонентами Qt6 и Python.
- Я проверил, что все исходные файлы включены в список BINDING_FILES.
- Я проверил, нет ли отсутствующих зависимостей, которые могли бы привести к тому, что привязки классов не отображаются.
- br />
- Могут ли возникнуть проблемы с тем, как я устанавливаю настроить привязки Pybind11?
- Есть ли что-то конкретное, что мне следует проверить в конфигурации CMake или способе связывания библиотеки?
Подробнее здесь: https://stackoverflow.com/questions/791 ... -i-defined