oceanbase-4.4.2_CE_BP1编译test_physical_plan_ctx_serialize_compat失败

【 使用环境 】构建环境
【 OB or 其他组件 】unittest
【 使用版本 】oceanbase-4.4.2_CE_BP1
【问题描述】:
unittest编译到test_physical_plan_ctx_serialize_compat, test_expr_serialize_compat就会报错, 最开始是在rocky 9(我自己适配了dep_create.sh)上遇到, 后来改用dep_create.sh支持的almalinux 8也遇到同样的问题

rocky 9时的日志:

[ 97%] Building CXX object unittest/sql/engine/px/CMakeFiles/test_gambling_bound.dir/test_gambling_bound.cpp.o
ld.lld: error: undefined symbol: oceanbase::sql::ObExpr42x::get_serialize_size() const
>>> referenced by test_expr_serialize_compat.cpp:112 (./unittest/sql/engine/expr/test_expr_serialize_compat.cpp:112)
>>>               CMakeFiles/test_expr_serialize_compat.dir/test_expr_serialize_compat.cpp.o:(oceanbase::sql::ObExpr42x::serialize(char*, long, long&) const)
ld.lld: error: undefined symbol: oceanbase::sql::ObPhysicalPlanCtx42x::get_serialize_size() const
>>> referenced by test_physical_plan_ctx_serialize_compat.cpp:185 (./unittest/sql/engine/test_physical_plan_ctx_serialize_compat.cpp:185)
>>>               CMakeFiles/test_physical_plan_ctx_serialize_compat.dir/test_physical_plan_ctx_serialize_compat.cpp.o:(oceanbase::sql::ObPhysicalPlanCtx42x::serialize(char*, long, long&) const)
clang++-17: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [unittest/sql/engine/expr/CMakeFiles/test_expr_serialize_compat.dir/build.make:161: unittest/sql/engine/expr/test_expr_serialize_compat] Error 1
make[1]: *** [CMakeFiles/Makefile2:14976: unittest/sql/engine/expr/CMakeFiles/test_expr_serialize_compat.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
clang++-17: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [unittest/sql/engine/CMakeFiles/test_physical_plan_ctx_serialize_compat.dir/build.make:161: unittest/sql/engine/test_physical_plan_ctx_serialize_compat] Error 1
make[1]: *** [CMakeFiles/Makefile2:14742: unittest/sql/engine/CMakeFiles/test_physical_plan_ctx_serialize_compat.dir/all] Error 2

almalinux 8时的截图:

【复现路径】:

$ bash build.sh debug --init --make
$ cd build_debug/unittest
$ make -j 1
1 个赞

mark ~

这是 链接阶段 的 未定义符号(undefined symbol),不是编译器语法错误。缺失的符号是:

  • oceanbase::sql::ObExpr42x::get_serialize_size() const
  • oceanbase::sql::ObPhysicalPlanCtx42x::get_serialize_size() const

这两个类型只出现在 单测源码 里(test_expr_serialize_compat.cpp / test_physical_plan_ctx_serialize_compat.cpp),用于做旧版序列化兼容测试,并不是主库缺实现。
单测里的 42x 桩类型按统一序列化宏写了 serialize ,但在 Debug 下 serialize 会校验长度并调用 get_serialize_size(),而单测未用 OB_DEF_SERIALIZE_SIZE 提供实现,导致链接失败;与 Rocky/Alma 发行版本身无必然因果关系,主要是 Debug + 宏不完整。