You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本

  1. 查看Open3D编译时依赖的Protobuf版本:
    strings /usr/local/lib/libOpen3D.so | grep -E "libprotobuf.*\.so\.[0-9]+"
    
  2. 卸载系统当前的Protobuf,安装与上述查询结果完全匹配的版本
  3. 重新编译你的proto文件和项目

额外注意事项

  • 不要手动添加include_directories("/usr/local/include/open3d"),find_package(Open3D REQUIRED)已经自动处理了头文件路径
  • 避免混用link_directories和target_link_libraries的变量形式,优先使用CMake的目标链接语法(如Open3D::Open3D),确保依赖顺序正确

内容的提问来源于stack exchange,提问作者Cassius0924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:42:26