CMake编译Protobuf与Open3D项目时出现未定义引用错误
问题定位
这个链接错误的核心原因是Open3D内部已编译并绑定了自身的Protobuf版本,与你系统中独立安装的Protobuf库版本不兼容,导致二进制接口(ABI)不匹配。当同时链接系统Protobuf和Open3D时,链接器会优先使用Open3D内置的Protobuf符号,但你的.pb.cc文件是用系统Protobuf的protoc编译生成的,两者的类结构、虚函数表不一致,就出现了google::protobuf::Message相关的未定义引用。
解决方案
方案1:使用Open3D自带的Protobuf组件(推荐)
直接依赖Open3D打包的Protobuf,避免版本冲突,修改CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.10) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(this_target protoTest) # 查找Open3D并启用其内置的Protobuf组件 find_package(Open3D REQUIRED COMPONENTS Protobuf) # 如果需要自动编译proto文件,替换成以下代码(替换为你的proto路径) # protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/polygon.proto) add_executable(protoTest src/protoTest.cpp src/polygon.pb.cc src/polygon.pb.h ) # 链接Open3D及其内置的Protobuf,CMake自动处理依赖顺序 target_link_libraries(protoTest PRIVATE Open3D::Open3D Open3D::Protobuf)
方案2:统一系统与Open3D的Protobuf版本
- 查看Open3D编译时依赖的Protobuf版本:
strings /usr/local/lib/libOpen3D.so | grep -E "libprotobuf.*\.so\.[0-9]+" - 卸载系统当前的Protobuf,安装与上述查询结果完全匹配的版本
- 重新编译你的proto文件和项目
额外注意事项
- 不要手动添加
include_directories("/usr/local/include/open3d"),find_package(Open3D REQUIRED)已经自动处理了头文件路径 - 避免混用
link_directories和target_link_libraries的变量形式,优先使用CMake的目标链接语法(如Open3D::Open3D),确保依赖顺序正确
内容的提问来源于stack exchange,提问作者Cassius0924
相关产品推荐
相关产品推荐

