Я пытаюсь запустить простой пример pybind11.
Вот мой код компиляции (с официального сайта pybind11):
c++ -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup `python3 -m pybind11 --includes` wrapper.cpp -o example`python3-config --extension-suffix`
Я получаю три файла.
funcs. cpp
#include "funcs.hpp"
int add(int i, int j) {
return i + j;
};
funcs.hpp
int add(int i, int j);
упаковщик. cpp
#include <pybind11/pybind11.h>
#include "funcs.hpp"
namespace py = pybind11;
PYBIND11_MODULE(example, m){
m.def("add", &add, "A function which adds two numbers");
}
, а также .py файл для запуска теста
main.py
import example
if __name__ =='__main__':
print(example.add(1, 2))
Однако, это выдает ошибку
$python main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
import example
ImportError: dlopen(/Users/nirvana_kwai/dev/dev_setup/dark_magic/pybindtest/example.cpython-36m-darwin.so, 2): Symbol not found: __Z3addii
Referenced from: /Users/nirvana_kwai/dev/dev_setup/dark_magic/pybindtest/example.cpython-36m-darwin.so
Expected in: flat namespace
in /Users/nirvana_kwai/dev/dev_setup/dark_magic/pybindtest/example.cpython-36m-darwin.so
И если Я изменяю только одну строку в оболочке. cpp с #include "funcs.hpp"
на #include "funcs.cpp"
. Ошибка исправлена. Я действительно не понимаю, где проблема. Я много гуглю и исправляю, когда пытаюсь упростить кейс и объединить весь код в один файл.
Может кто-нибудь помочь мне здесь?