我正在尝试将crfsuite的Swig接口编译为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
我已经使用默认的export.i
生成了Swig包装器:
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
constructor。
这都是很新的东西,所以我迷失在许多步骤之间。我是否缺少明显的东西?为什么符号未正确链接?以及如何解决?
更新:
我已将$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
文件的顺序。没有任何改变。