编译SYSTRAN/fuzzy-match时如何通过CMake变量指定自定义库路径
编译fuzzy-match的CMake配置实操步骤
核心问题根源
报错本质是CMake无法定位OpenNMT/Tokenizer的库与头文件路径,无需手动修改项目的CMakeLists.txt源码,所有路径配置通过cmake命令行参数传入即可。
操作步骤
- 第一步:确认OpenNMT/Tokenizer的真实安装路径
找到你之前编译完成的OpenNMT/Tokenizer安装根目录,该路径必须同时满足两个特征:- 路径下
lib子目录存在编译生成的OpenNMTTokenizer相关库文件 - 路径下
include子目录存在onmt/Tokenizer.h头文件
如果当初编译OpenNMT/Tokenizer时未指定自定义安装前缀,默认安装路径为系统目录
/usr/local/,该路径属于CMake默认搜索范围,一般无需额外传入OPENNMT_TOKENIZER_ROOT变量。如果只是克隆了Tokenizer源码、未执行make install步骤,根路径填你单独编译Tokenizer时的build输出目录即可。 - 路径下
- 第二步:清理旧的CMake缓存
之前多次执行cmake已经在build目录生成了带错误变量值的缓存,必须先清空再重新配置:# 进入项目的build目录 cd build # 删除所有残留的CMake缓存文件 rm -rf * - 第三步:携带路径参数执行CMake配置
把路径替换为你实际的OpenNMT/Tokenizer根路径,执行以下命令:# 替换<OpenNMT/Tokenizer实际安装根路径>为你的本地路径,例如/home/paul/Documents/proj_tansv/Tokenizer cmake .. -DOPENNMT_TOKENIZER_ROOT=<OpenNMT/Tokenizer实际安装根路径> - 针对当前仅报
OPENNMT_TOKENIZER_LIB找不到的场景排查
按照项目CMakeLists.txt的逻辑,CMake会从你指定的根路径下的lib子目录中搜索名为OpenNMTTokenizer的库文件,匹配失败就会触发当前报错:- 先检查路径下的实际库文件名是否和CMake的搜索名匹配,若存在命名不匹配的情况,可显式直接传入库和头文件的绝对路径:
cmake .. \ -DOPENNMT_TOKENIZER_LIB=<实际的OpenNMTTokenizer库文件完整绝对路径,例如/home/paul/.../lib/libOpenNMTTokenizer.a> \ -DOPENNMT_TOKENIZER_INCLUDE=<实际存放onmt/Tokenizer.h的头文件目录,例如/home/paul/.../include>
- 先检查路径下的实际库文件名是否和CMake的搜索名匹配,若存在命名不匹配的情况,可显式直接传入库和头文件的绝对路径:
常见注意事项
- 不建议直接编辑项目CMakeLists.txt硬编码路径,后续拉取项目更新时易产生代码冲突,所有自定义路径统一通过cmake的
-D参数传入即可 - 如果在同一个CMake工程中通过
add_subdirectory方式引入OpenNMT/Tokenizer源码,CMake会自动识别内置的OpenNMTTokenizer目标,无需额外传入路径变量 - 若OpenNMT/Tokenizer编译时启用了ICU依赖,额外追加
-DCMAKE_PREFIX_PATH=<ICU实际安装路径>参数即可,无需修改其他配置
内容的提问来源于stack exchange,提问作者CaptainCoding7
相关产品推荐
相关产品推荐

