Я пытаюсь скомпилировать интерфейс swig crfsuite как модуль PHP. Пока что мне удалось скомпилировать файл crfsuite.so
, загрузить его как расширение в PHP и вызвать методы для него. Насколько я вижу, любой вызов метода, который был упакован SWIG, прекрасно работает из коробки. К сожалению, мне не хватает некоторых символов:
❯ nm crfsuite.so | grep crfsuite
U crfsuite_attribute_set
U crfsuite_create_instance
U crfsuite_create_instance_from_file
U crfsuite_create_instance_from_memory
U crfsuite_data_append
U crfsuite_data_finish
U crfsuite_data_init
00000000000281b3 T crfsuite_dictionary_create_instance
U crfsuite_evaluation_accmulate
U crfsuite_evaluation_finalize
U crfsuite_evaluation_init
U crfsuite_evaluation_output
0000000000256460 B crfsuite_globals
U crfsuite_instance_finish
U crfsuite_instance_init_n
U crfsuite_interlocked_decrement
U crfsuite_interlocked_increment
U crfsuite_item_append_attribute
U crfsuite_item_init
U crfsuite_item_init_n
Я сгенерировал оболочку Swig следующим образом, используя значение по умолчанию export.i
:
swig -c++ -php7 -Icrfsuite/include -o export_wrap.cpp export.i
После этого я скомпилировал код с помощью следующих команд:
gcc -fpic -Icrfsuite/include -Icrfsuite/lib/cqdb/include -Iliblbfgs/include \
`php-config --includes` -c crfsuite.cpp export_wrap.cpp crfsuite/lib/crf/src/*.c \
crfsuite/swig/*.cpp crfsuite/lib/cqdb/src/cqdb.c crfsuite/lib/cqdb/src/lookup3.c \
liblbfgs/lib/*.c
gcc -shared *.o -o crfsuite.so
Я играл со многими gcc
флагами, такими как -L/usr/local/lib
, -lcrfsuite
, -Wl,-undefined,dynamic_lookup
, но остановился, так как они, похоже, не повлияли на результат.
Запуск базового примера ошибок со следующим сообщением:
/usr/bin/php: symbol lookup error: /usr/lib/php/20170718/crfsuite.so: undefined symbol: crfsuite_data_init
В примере правильно вызывается конструктор Trainer
.
Все это довольно ново, поэтому я заблудился между многими шагами. Я что-то упускаю из виду? Почему символы не связаны правильно? И как это можно исправить?
Обновление:
Я установил $LD_LIBRARY_PATH
и $LD_RUN_PATH
на /usr/local/lib
. В этом случае скомпилированная и установленная версия crfsuite является общим объектом:
ll $LD_LIBRARY_PATH/libcrfsuite.so
/usr/local/lib/libcrfsuite.so -> libcrfsuite-0.12.so
Я также изменил порядок файлов .o
. Ничего не изменилось.