ClickHouse编译问题:编译报错undefined reference to

举报
ZhjDayDayUp 发表于 2021/12/30 19:30:38 2021/12/30
【摘要】 记录一下clickhouse编译遇到的问题,报错undefined reference to

问题现象

今天编译clickhouse时,由于服务器内存不够导致编译中断退出了,重新编译后报如下错误:

Functions/array/libclickhouse_functions_array.a(hasAll.cpp.o):hasAll.cpp:function DB::FunctionArrayHasAllAny::executeImpl(std::__1::vector<DB::ColumnWithTypeAndName, std::__1::allocator<DB::ColumnWithTypeAndName> > const&, std::__1::shared_ptr<DB::IDataType const> const&, unsigned long) const: error: undefined reference to '_ZN2DB11GatherUtils11sliceHasAnyERNS0_12IArraySourceES2_RNS_12ColumnVectorIDuEE'
collect2: error: ld returned 1 exit status
make[2]: *** [src/unit_tests_dbms] Error 1
make[1]: *** [src/CMakeFiles/unit_tests_dbms.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
../src/Functions/array/libclickhouse_functions_array.a(hasAll.cpp.o):hasAll.cpp:function DB::FunctionArrayHasAllAny::executeImpl(std::__1::vector<DB::ColumnWithTypeAndName, std::__1::allocator<DB::ColumnWithTypeAndName> > const&, std::__1::shared_ptr<DB::IDataType const> const&, unsigned long) const: error: undefined reference to '_ZN2DB11GatherUtils11sliceHasAnyERNS0_12IArraySourceES2_RNS_12ColumnVectorIDuEE'
collect2: error: ld returned 1 exit status
make[2]: *** [programs/clickhouse] Error 1
make[1]: *** [programs/CMakeFiles/clickhouse.dir/all] Error 2
make: *** [all] Error 2

因为我同样的代码原来是可以编译成功,所以肯定不会是代码问题。以前遇到这种问题,我都是直接全部重新编译,但那样很花时间,今天想具体分析下。

问题分析

1、从报错看,FunctionArrayHasAllAny::executeImpl函数需要调用GatherUtils::sliceHasAny,但是没有找到后者定义的地方。

2、去代码中找,GatherUtils::sliceHasAny函数定义在/src/Functions/GatherUtils/has_all.cpp中,而该函数正常编译后的符号应该会在对应目录下的库文件中,这里是libclickhouse_functions_gatherutils.a。查看下是否存在该符号

nm libclickhouse_functions_gatherutils.a |grep _ZN2DB11GatherUtils11sliceHasAnyERNS0_12IArraySourceES2_RNS_12ColumnVectorIDuEE

正常情况下,应该是这样的:

0000000000000000 t _GLOBAL__sub_I__ZN2DB11GatherUtils11sliceHasAnyERNS0_12IArraySourceES2_RNS_12ColumnVectorIDuEE
000000000002e5e0 T _ZN2DB11GatherUtils11sliceHasAnyERNS0_12IArraySourceES2_RNS_12ColumnVectorIDuEE

但是,现在却报错了:

nm: has_any.cpp.o: File format not recognized

好,找到了问题文件。

3、目标文件的格式不对,那就看下目标文件怎么不对了。
解压.a文件

ar -x libclickhouse_functions_gatherutils.a

ll
drwx------ 3 root root     4096 Dec 30 14:23 CMakeFiles
-rw------- 1 root root     1283 Dec 30 14:19 cmake_install.cmake
-rw------- 1 root root   888680 Dec 30 19:09 concat.cpp.o
-rw------- 1 root root   365368 Dec 30 19:09 createArraySink.cpp.o
-rw------- 1 root root   595408 Dec 30 19:09 createArraySource.cpp.o
-rw------- 1 root root   438304 Dec 30 19:09 createValueSource.cpp.o
-rw------- 1 root root      343 Dec 30 14:19 CTestTestfile.cmake
-rw------- 1 root root  7365576 Dec 30 19:09 has_all.cpp.o
-rw------- 1 root root        0 Dec 30 19:09 has_any.cpp.o
-rw------- 1 root root 11307056 Dec 30 19:09 has_substr.cpp.o
-rw------- 1 root root 32085840 Dec 30 15:47 libclickhouse_functions_gatherutils.a
-rw------- 1 root root    33786 Dec 30 14:19 Makefile
-rw------- 1 root root  1130000 Dec 30 19:09 push.cpp.o
-rw------- 1 root root  1213720 Dec 30 19:09 resizeConstantSize.cpp.o
-rw------- 1 root root  1301840 Dec 30 19:09 resizeDynamicSize.cpp.o
-rw------- 1 root root   721256 Dec 30 19:09 sliceDynamicOffsetBounded.cpp.o
-rw------- 1 root root   665864 Dec 30 19:09 sliceDynamicOffsetUnbounded.cpp.o
-rw------- 1 root root   637976 Dec 30 19:09 sliceFromLeftConstantOffsetBounded.cpp.o
-rw------- 1 root root   626416 Dec 30 19:09 sliceFromLeftConstantOffsetUnbounded.cpp.o
-rw------- 1 root root   634680 Dec 30 19:09 sliceFromRightConstantOffsetBounded.cpp.o
-rw------- 1 root root   628456 Dec 30 19:09 sliceFromRightConstantOffsetUnbounded.cpp.o

has_any.cpp.o文件明显有问题,大小都是0了,查看内容也是什么都没有。

4、因为考虑到有些编译什么的,也不好单独编译这个cpp文件,但是可以将这个库文件清除后,再增量编译就好了。

// 在src/Functions/GatherUtils目录下
make clean
// 在build目录下
make -j8

其实,对于第三第四步,有更好的处理方式。

在src/Functions/GatherUtils目录下,会有CMakeFiles文件夹,在里面找到has_any.cpp.o

cd src/Functions/GatherUtils/CMakeFiles/clickhouse_functions_gatherutils.dir/
ll
total 30440
-rw------- 1 root root    42271 Dec 30 14:19 build.make
-rw------- 1 root root     1543 Dec 30 14:22 cmake_clean.cmake
-rw------- 1 root root       64 Dec 30 14:22 cmake_clean_target.cmake
-rw------- 1 root root   888680 Dec 30 19:18 concat.cpp.o
-rw------- 1 root root   365368 Dec 30 19:18 createArraySink.cpp.o
-rw------- 1 root root   595408 Dec 30 19:18 createArraySource.cpp.o
-rw------- 1 root root   438304 Dec 30 19:18 createValueSource.cpp.o
-rw------- 1 root root   143219 Dec 30 15:34 CXX.includecache
-rw------- 1 root root    26467 Dec 30 14:19 DependInfo.cmake
-rw------- 1 root root   591371 Dec 30 15:34 depend.internal
-rw------- 1 root root  1784675 Dec 30 15:34 depend.make
-rw------- 1 root root     6285 Dec 30 14:19 flags.make
-rw------- 1 root root  7365576 Dec 30 19:18 has_all.cpp.o
-rw------- 1 root root        0 Dec 30 19:22 has_any.cpp.o
-rw------- 1 root root 11307056 Dec 30 19:18 has_substr.cpp.o
-rw------- 1 root root     1343 Dec 30 14:19 link.txt
-rw------- 1 root root      349 Dec 30 14:23 progress.make
-rw------- 1 root root  1130000 Dec 30 19:18 push.cpp.o
-rw------- 1 root root  1213720 Dec 30 19:18 resizeConstantSize.cpp.o
-rw------- 1 root root  1301840 Dec 30 19:18 resizeDynamicSize.cpp.o
-rw------- 1 root root   721256 Dec 30 19:18 sliceDynamicOffsetBounded.cpp.o
-rw------- 1 root root   665864 Dec 30 19:18 sliceDynamicOffsetUnbounded.cpp.o
-rw------- 1 root root   637976 Dec 30 19:18 sliceFromLeftConstantOffsetBounded.cpp.o
-rw------- 1 root root   626416 Dec 30 19:18 sliceFromLeftConstantOffsetUnbounded.cpp.o
-rw------- 1 root root   634680 Dec 30 19:18 sliceFromRightConstantOffsetBounded.cpp.o
-rw------- 1 root root   628456 Dec 30 19:18 sliceFromRightConstantOffsetUnbounded.cpp.o

然后,只要将该文件删除,再重新编译就好了。

rm -rf has_any.cpp.o
// 在build目录下
make -j8
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。