CMake中find_package(Protobuf REQUIRED)失效及版本匹配问题求助
Protobuf与CMake配置问题解答
问题背景
在Ubuntu 20.04环境下,手动编译了Protobuf 21.12版本并将protoc复制到/usr/local/bin,但配置CMakeLists.txt后运行时出现以下问题:
- 大量找不到Protobuf内部头文件的错误
- 警告提示
Protobuf compiler version 21.12 doesn't match library version find_package找到的是系统默认路径/usr/lib/x86_64-linux-gnu/libprotobuf.so和/usr/include
疑问解答
1. 为什么find_package(Protobuf REQUIRED)会在/usr/lib/x86_64-linux-gnu/libprotobuf.so路径查找库?
CMake的FindProtobuf模块有固定的搜索优先级:
- 系统默认的标准路径(如
/usr/lib、/usr/include)属于CMake内置的高优先级搜索路径,会优先于/usr/local这类自定义安装路径被检索 - 你编译的Protobuf默认安装到
/usr/local,但未主动告知CMake优先搜索该路径,因此它会先找到系统预装的旧版本Protobuf
2. 如何找到我编译的21.12版本对应的libprotobuf.so?
提供三种可行方案:
- 指定自定义路径编译Protobuf:重新编译时指定专属安装目录,避免和系统版本混淆:
之后运行CMake时通过参数指定优先搜索该路径:cmake ../protobuf -DCMAKE_INSTALL_PREFIX=/opt/protobuf-21.12 make && sudo make install
或在CMakeLists.txt中修改cmake .. -DCMAKE_PREFIX_PATH=/opt/protobuf-21.12find_package语句:find_package(Protobuf REQUIRED PATHS /opt/protobuf-21.12) - 利用默认安装路径(/usr/local):Protobuf默认编译后会安装到
/usr/local/lib和/usr/local/include,同时会在/usr/local/lib/cmake/protobuf生成CMake配置文件。运行CMake时指定:
或在CMakeLists.txt中提前设置路径:cmake .. -DCMAKE_PREFIX_PATH=/usr/localset(Protobuf_DIR /usr/local/lib/cmake/protobuf) find_package(Protobuf REQUIRED) - 手动强制指定路径:如果上述方法无效,直接在CMakeLists.txt中手动赋值:
set(Protobuf_INCLUDE_DIRS /usr/local/include) set(Protobuf_LIBRARIES /usr/local/lib/libprotobuf.so)
3. 是否需要包含Protobuf所有源文件头,还是仅需libprotobuf.so这类库文件?
不需要包含Protobuf的所有源文件头,只需要以下三类内容:
- 由
protobuf_generate_cpp生成的自定义.proto文件对应的头文件(即变量PROTO_HDRS包含的文件) - Protobuf库的公共头文件(即
Protobuf_INCLUDE_DIRS指向路径下的头文件,如google/protobuf/*.h) - 链接
libprotobuf.so(或对应的静态库文件)即可,完全不需要将Protobuf的源码加入自身项目
内容的提问来源于stack exchange,提问作者Dan.Z.Lu
相关产品推荐
相关产品推荐

