ImportError: неопределенный символ при импорте Swigged C ++ - класс в Python - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь использовать c ++ - класс для сокетной связи в Python.Поэтому я создал класс, который использует nngpp .При импорте файла swigged в python я получаю ImportError: неопределенный символ: nng_msg_insert.Определение класса:

/* commclass.h */
#include <nngpp/nngpp.h>
#include <nngpp/protocol/req0.h>
#include <nngpp/protocol/rep0.h>
#include <nngpp/msg_body.h>
#include <nngpp/msg_header.h>
#include <nngpp/msg.h>
#include <nngpp/socket.h>
#include <nngpp/view.h>
#include <string>
#include <nlohmann/json.hpp>
//#include <thread>
#include <iostream>
#include <cstdio>
#include "/usr/local/include/nng/nng.h"
//#include <memory>
#include <chrono>
using json = nlohmann::json;

class CommIF
{
private:
    nng::socket socket;
    nng::msg message;
    int msg_size;
public:
    CommIF(const std::string option, std::string ipToListen, std::string ipToDial)
    {
        message = nng::make_msg(0);
        if (option.compare("rep") == 0)
        {
            socket = std::move(nng::rep::v0::open());
        }
        else if (option.compare("req") == 0)
        {
            socket = std::move(nng::req::v0::open());
        }
        else
        {
            printf("EXCEPTION");
        }
        socket.listen(ipToListen.c_str());
        bool connected = false;
        while (connected == false)
        {
            try
            {
                socket.dial(ipToDial.c_str());
                connected = true;
                std::cout << "successfully connected\n";
            }
            catch (const nng::exception &e)
            {
                std::cerr << e.what() << "; retry in 1 s" << '\n';
                //std::this_thread::sleep_for(std::chrono::seconds(1));
            }
        }
        msg_size = 0;
    }
};

Файл интерфейса для swig:

/* commclass.i */
%module commclass
%{
#include "src/commclass.h"
%}
%include "src/commclass.h"

Затем я запускаю команду python3 build_commclass.py build_ext --inplace процесс сборки.Файл build_commclass.py выглядит следующим образом:

from distutils.core import setup, Extension
import os

name = "commclass"
version = "0.0.1"               
os.environ["CC"] = "g++"

setup(name = name, version = version, ext_modules = [Extension(
name = '_commclass', 
sources = ["commclass.i"],#"src/commclass.h"],
include_dirs = ['src'],#'/home/user1/Documents/extLibs','/usr/local/include'],
swig_opts = ["-c++", "-modern"]
)])

Когда я сейчас импортирую класс в python, я получаю ошибку, упомянутую выше.Я много искал в google и stackoverflow, и я совершенно уверен, что это проблема компоновщика.Я также пробовал много разных вещей с опциями компилятора и компоновщика distutils.core, но я не нашел решения.

Редактировать 1: теперь я изменил файл интерфейса следующим образом

/* commclass.i */
/* module*/
%module commclass
%{
#include "/usr/local/include/nng/nng.h"
#include "src/nngpp/nngpp.h"
#include "src/nngpp/protocol/req0.h"
#include "src/nngpp/protocol/rep0.h"
#include "src/nngpp/socket.h"
#include "src/nngpp/msg.h"
#include "src/nngpp/aio.h"
#include "src/nngpp/aio_view.h"
#include "src/nngpp/msg_body.h"
#include "src/nngpp/msg_header.h"
#include "src/commclass.h"
%}
%include "/usr/local/include/nng/nng.h"
%include "src/commclass.h"

Теперь я получаю ту же ошибку при импорте в python, но неопределенный символ изменился.Сейчас nng_aio_set_iovnng_msg_insert, и nng_aio_set_iov определены в файле nng.h, который я сейчас включил.Я сейчас в замешательстве.

1 Ответ

1 голос
/ 05 июля 2019

SWIG генерирует интерфейсы только для определений, которые по умолчанию задаются %include. nng_msg_insert не определено в src/commclass.h. Вам нужны дополнительные операторы %include, чтобы ввести определение.

Обратите внимание, что вы можете изменить значение по умолчанию для рекурсии во все операторы #include с флагом -includeall SWIG, но вы, как правило, не хотите, чтобы все интерфейсы <iostream>, <cstdio>, <string> и т. Д. быть обернутым, и это, вероятно, не будет работать без больших дополнительных усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...