kenlm c++

系统

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依然没有解决。

解决方案

  1. 用VS code软件将kenlm工程打开,搜索add_library, 将生产静态库的都改为动态库,如add_library(kenlm_builder ${KENLM_BUILDER_SOURCE}) 改为add_library(kenlm_builder SHARED ${KENLM_BUILDER_SOURCE})。

  2. 编译时可能会报错误:/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。

  1. 在自己的工程中采用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})
  1. 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤劳的凌菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值