ClickHouse编译问题:编译报错undefined reference to
【摘要】 记录一下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)