Distutils приводит к сбою protobuf - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть простое .proto следующим образом:

syntax = "proto2";

package p2p;

message  dataFrame {
repeated int64 row_label = 1;
repeated int64 col_label = 2;

message data_frame_row {
    repeated int32 column = 1;
}

repeated data_frame_row row = 3;
}

, которое я компилирую с protoc.

Я могу скомпилировать и использовать следующий (упрощенный) код cpp (TransitMatrix.h #включает в себя "p2p.pb.h"):

#include "transitMatrix.h"

int main()
{

transitMatrix matrix(5, true);
matrix.addEdgeToGraph(0, 1, 5, true);
matrix.addEdgeToGraph(1, 2, 6, true);

matrix.writeTMX("outfile.tmx");
return 0;
}

Тем не менее, класс tranmatrix предназначен для цитонизации с помощью distutils.

В моем (упрощенном) файле test.pyx, я cdefextern и класс tranMatrix, и класс dataFrame:

cdef extern from "src/utils/serializer/p2p.pb.cc" namespace "p2p":
    cdef cppclass dataFrame:
        dataFrame()


cdef extern from "src/transitMatrix.h":

    cdef cppclass transitMatrix:
        transitMatrix()

И в моем файле setup.py расширение distutils выглядит следующим образом:

EXTENSION = distutils.extension.Extension(
name = 'test', language = 'c++',
sources = ['test.pyx'],
extra_compile_args = ['-Wno-unused-function', 
                      '-std=c++11', '-Wall', '-O3', '-lprotobuf'
                      ] + ouff_mac,
undef_macros       = ["NDEBUG"],
extra_link_args    = ouff_mac
)

Когда я запускаю python3 setup.py, устанавливаем, это успешно, но предупреждает:

clang: warning: -lprotobuf: 'linker' input unused

Наконец, когда я пытаюсь импортировать сгенерированный класс в iPython (transitionMatrixAdapter), я получаю следующую ошибку:

ImportError: dlopen(/Users/user/anaconda3/lib/python3.6/site-    packages/transitMatrixAdapter.cpython-36m-darwin.so, 2): Symbol not found:   __ZN6google8protobuf7Message20DiscardUnknownFieldsEv
Referenced from: /Users/user/anaconda3/lib/python3.6/site-packages/transitMatrixAdapter.cpython-36m-darwin.so
Expected in: flat namespace in /Users/user/anaconda3/lib/python3.6/site-packages/transitMatrixAdapter.cpython-36m-darwin.so

Я должен добавить, чтоэто работает, как и ожидалось, когда зависимость от protobuf удалена.Почему .so не найден?Я предполагаю, что это ошибка компоновщика, но где проблема?

...