Protobuf PROTOC LIBRARY NOTFOUND
# 1. 背景与现象
Hadoop 3.3.4 在执行 native 组件构建时,hadoop-hdfs-native-client
模块 CMake 失败:
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
Protobuf_PROTOC_LIBRARY
linked by target "protoc-gen-hrpc" in directory .../hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/proto
...
-- Performing Test PROTOC_IS_COMPATIBLE - Failed
[ERROR] ... hadoop-hdfs-native-client: CMake failed with error code 1
1
2
3
4
5
6
7
2
3
4
5
6
7
伴随环境探测信息(节选):
- Ubuntu 22.04 / GCC 11.4
- OpenSSL 3.0.2 已找到
- Protobuf 库版本
3.12.4
- 找到
libsasl2.so
、libgsasl.so
- 但缺
Protobuf_PROTOC_LIBRARY
,并出现PROTOC_IS_COMPATIBLE
失败
关键信号
Protobuf_PROTOC_LIBRARY
对应 libprotoc(protocol compiler library),不是可执行文件 protoc
。仅装了 protobuf-compiler
或 libprotobuf-dev
,但 缺少 libprotoc-dev,就会触发该 NOTFOUND。
# 2. 根因定位
缺少 libprotoc 开发库 CMake 的
FindProtobuf.cmake
会同时寻找:protoc
可执行文件(protobuf-compiler
)libprotobuf
(libprotobuf-dev
)libprotoc
(libprotoc-dev
)← 你缺这个
protoc 与库版本不兼容
PROTOC_IS_COMPATIBLE - Failed
一般是 protoc 版本 与 libprotobuf/libprotoc 版本不一致(例如protoc
来自/usr/local
的 3.21+,而系统库是 3.12.4)。历史手工安装残留
/usr/local/include
、/usr/local/lib
中遗留的旧版 Protobuf 头文件/库优先级更高,导致 CMake/ld 链接到错误版本。
# 3. 快速修复(Ubuntu 22.04 标准环境)
# 3.1 一次性补齐依赖
sudo apt-get update
sudo apt-get install -y \
protobuf-compiler \
libprotobuf-dev \
libprotoc-dev \
pkg-config
1
2
3
4
5
6
2
3
4
5
6
# 3.2 校验版本一致性
protoc --version # 例如 libprotoc 3.12.4
pkg-config --modversion protobuf # 3.12.4(与上面一致为佳)
ldconfig -p | grep -E 'libprotoc|libprotobuf'
1
2
3
2
3
若看到 /usr/local 下的更高/更低版本
说明系统存在手工安装残留。建议清理 /usr/local/include/google/protobuf
与 /usr/local/lib/libproto*
,或在构建时显式指定
CMAKE_PREFIX_PATH 到 /usr
,避免优先命中 /usr/local
。
# 3.3 清理并重编
Bigtop/Hadoop 源内的 native 目标需清理缓存后再构建:
# 回到 Hadoop 源码根目录(或 Bigtop 输出的 Hadoop 源目录)
mvn \
-Dsnappy.prefix=x \
-Dbundle.snappy=true \
-Dsnappy.lib=/usr/lib/x86_64-linux-gnu \
-Pdist -Pnative -Psrc -Pyarn-ui -Dtar \
-Dzookeeper.version=3.5.9 \
-Dleveldbjni.group=org.fusesource.leveldbjni \
-DskipTests -DskipITs \
-Drequire.openssl=true \
-Drequire.isal=true \
-Drequire.pmdk=true \
-DProtobuf_PROTOC_EXECUTABLE=/usr/bin/protoc \
-DProtobuf_LIBRARY=/usr/lib/x86_64-linux-gnu/libprotobuf.so \
-DProtobuf_LITE_LIBRARY=/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so \
-DProtobuf_PROTOC_LIBRARY=/usr/lib/x86_64-linux-gnu/libprotoc.so \
-Drequire.zstd=true \
install \
-Divy.home=/root/.ivy2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 01
- [/metrics/aggregated] — 聚合数据范围 检查点09-19
- 02
- [/metrics] — 反向分析接口参数 请求抓包09-17
- 03
- [/metrics] — 普通指标写入方法 POST09-17