У меня есть простое .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 не найден?Я предполагаю, что это ошибка компоновщика, но где проблема?