Скомпилируйте расширение PHP, используя SWIG - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь скомпилировать интерфейс 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. Ничего не изменилось.

...