系统
ubuntu
编译问题
按照官网给的编译方案,会在build/lib 下生成四个.a静态文件,将这四个文件通过target_link_libraries 添加在工程后,虽然include没有问题,但是加载模型时会报一堆的
model.cc? error: undefined reference to `util::Pool::~Pool()’
之类的错误,按照https://blog.csdn.net/luoyexuge/article/details/82109526#commentsedit依然没有解决。
解决方案
-
用VS code软件将kenlm工程打开,搜索add_library, 将生产静态库的都改为动态库,如add_library(kenlm_builder ${KENLM_BUILDER_SOURCE}) 改为add_library(kenlm_builder SHARED ${KENLM_BUILDER_SOURCE})。
-
编译时可能会报错误:/usr/bin/ld: /usr/local/lib/libbz2.a(bzlib.o): relocation R_X86_64_32S against symbol `BZ2_crc32Table’ can not be used when making a shared object; recompile with -fPIC
这是因为编译libbz2.a时没有采用 -fPIC
解决方法:按照https://blog.csdn.net/luoyexuge/article/details/82109526#commentsedit
重新编译,编译之前修改 zlib-1.2.8/Makefile
CFLAGS=-Wall -Winline -O2 -g -fPIC $(BIGFILES)
编译zlib后,再重新编译kenlm。
- 在自己的工程中采用kenlm时,在CMakeLists.txt添加以下代码:
include_directories("{存放kenlm工程的路径}/kenlm")
target_link_libraries(${PROJECT_NAME} /home/zy/Software/kenlm/build_debug/lib/libkenlm_builder.so
/home/zy/Software/kenlm/build_debug/lib/libkenlm_filter.so
/home/zy/Software/kenlm/build_debug/lib/libkenlm_util.so
/home/zy/Software/kenlm/build_debug/lib/libkenlm.so)
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})
set(KENLM_MAX_ORDER 6 CACHE STRING "Maximum supported ngram order") # KENLM_MAX_ORDER is set in CMakeLists
target_compile_definitions(${PROJECT_NAME} PUBLIC -DKENLM_MAX_ORDER=${KENLM_MAX_ORDER})
- c++接口测试
#include "lm/model.hh"
int main(){
const char *language_model_path = "{存放kenlm工程的路径}/kenlm/lm/test.arpa";
lm::ngram::Model model(language_model_path);
return 0;
}