Сборка Pybind11 — тестовый пример не запустится?

В настоящее время я пытаюсь настроить Pybind на своем Mac. Я следую этим инструкциям: https://pybind11.readthedocs.io/en/stable/basics.html.

Я клонировал репозиторий pybind на свой компьютер, создал каталог сборки в этом репо и запустил тестовые примеры (сделайте проверку -j 4).

Вот мой макет каталога:

Home/
    ---example.cpp
    ---pybind11/

У меня есть файл example.cpp, который я написал:

#include <pybind11/pybind11.h>

namespace py = pybind11;

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

PYBIND11_MODULE(example, m) {
        m.doc() = "pybind11 example plugin";

        m.def("add", &add, "A function which adds two numbers");
}
example.cpp

Я компилирую его со следующей командой и флагами (источник: https://pybind11.readthedocs.io/en/stable/compiling.html#building-manually):

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

Я получаю следующую ошибку:

example.cpp:1:10: fatal error: 'pybind11/pybind11.h' file not found
#include <pybind11/pybind11.h>
         ^~~~~~~~~~~~~~~~~~~~~
1 error generated.

Когда я перемещаю свой файл в репозиторий pybind11, я могу успешно скомпилировать, но выполнение дает мне следующую ошибку:

zsh: exec format error: ./example.cpython-37m-darwin.so

Любая помощь приветствуется.


Дополнение: я думаю, что Сет приблизил меня к тому, чтобы заставить его работать (большое спасибо), но у меня все еще есть эта проблема:

    c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix` -I pybind11/include/ 
/Applications/Xcode.app/Contents/Developer/usr/bin/python3: No module named pybind11.__main__; 'pybind11' is a package and cannot be directly executed
In file included from example.cpp:1:
In file included from pybind11/include/pybind11/pybind11.h:44:
In file included from pybind11/include/pybind11/attr.h:13:
In file included from pybind11/include/pybind11/cast.h:13:
In file included from pybind11/include/pybind11/pytypes.h:12:
pybind11/include/pybind11/detail/common.h:122:10: fatal error: 'Python.h' file not found
#include <Python.h>
     ^~~~~~~~~~
1 error generated.

Пытался следовать совету этого парня на github, но получаю ту же ошибку: https://github.com/pybind/pybind11/issues/1728#issuecomment-616619910


person Gromulus-Romulus    schedule 01.08.2020    source источник


Ответы (2)


Файл ‹pybind11/pybind11.h› отсутствует в вашем пути включения. Вы можете установить его в путь включения по умолчанию на вашей машине или добавить -I path_to_directory_content_pybind11 в команду компиляции.

person Seth    schedule 01.08.2020
comment
Ой! В этом есть смысл. Я не уверен, как обновить мой путь включения... разве это не то же самое, что моя переменная PATH? - person Gromulus-Romulus; 01.08.2020
comment
см. последний флаг в вашей строке компиляции: c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` example.cpp -o example `python3-config --extension-suffix` -I /Users/Seth/Developer/pybind11_git_install/ - person Seth; 01.08.2020
comment
Будет ли это обновление по умолчанию для моих машин включать путь? - person Gromulus-Romulus; 01.08.2020
comment
Я неправильно указал путь в своем предыдущем комментарии, это было бы <path>/pybind11_git_install/include Нет, это просто добавило бы его в эту строку компиляции (без изменения состояния вашей машины). Мое предложение состояло не в том, чтобы изменить/обновить путь включения по умолчанию, а в том, чтобы установить pybind11 по текущему пути по умолчанию (возможно, в /usr/local/). Pybind11 поставляется с документацией по его интеграции в ваш проект. github.com/pybind/pybind11/blob/master/docs/compiling. первый - person Seth; 01.08.2020
comment
Не совсем. :/ Я получаю новую ошибку: fatal error: 'Python.h' file not found. - person Gromulus-Romulus; 03.08.2020

Проблема решена: c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup PYTHONPATH=./pybind11 python -m pybind11 --includes example.cpp -o example`python3-config --extension-suffix

Использование makefile тоже работает.

person Gromulus-Romulus    schedule 03.08.2020