простой пример ошибки pybind11: задействован заголовок hpp - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь запустить простой пример 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". Ошибка исправлена. Я действительно не понимаю, где проблема. Я много гуглю и исправляю, когда пытаюсь упростить кейс и объединить весь код в один файл.

Может кто-нибудь помочь мне здесь?

1 Ответ

1 голос
/ 21 февраля 2020

, поскольку я новичок в stackoverflow, моя репутация не позволяет мне добавлять комментарии, поэтому пишу предложение в качестве ответа. Если @Lihaonan это решит вашу проблему, то это замечательно, и если не просто оставить комментарий, так сказать. Спасибо.

У меня есть два предложения для вас:

a) Поместите объявление в extern "C", перекомпилируйте и запустите вашу программу. Таким образом, ваш код в fun c .hpp будет выглядеть следующим образом:

extern "C"
{
    int add(int i, int j);
}

Я предлагаю это изменение, предполагая, что из-за искажения имени вы сталкиваетесь с этим проблема.

b) Я не уверен, почему вы не включили забаву c. cpp в этапы компиляции, но неопределенная ссылка появляется, когда среда выполнения не может найти определение одного из объявлений. Так что ваши шаги компиляции должны быть такими:

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