我尝试按照tiflash github仓库上的步骤编译tiflash,但是编译过程报了许多类似下面的错误:
第一种:
tiflash/dbms/src/Common/StringUtils/StringUtils.h:161:51: error: implicit instantiation of undefined template ‘std::tuple<std::basic_string, std::basic_string, bool>’
161 | inline std::tuple<std::string, std::string, bool> digit(const std::string & str, int x)
| ^
/usr/bin/…/lib/gcc/x86_64-linux-gnu/9/…/…/…/…/include/c++/9/bits/stl_pair.h:84:11: note: template is declared here
84 | class tuple;
| ^
第二种:
tiflash/dbms/src/VectorSearch/SIMDFeatures.h:25:17: error: no template named ‘vector’ in namespace ‘std’
25 | static std::vectorstd::string get();
| ^
还有许多基本的函数也报错,比如:
tiflash/dbms/src/Storages/DeltaMerge/RowKeyRange.h:885:23: error: no matching function for call to ‘min’
885 | range.start = std::min(range.start, r.start);
| ^
请问这是什么原因导致的呢?我的cmake版本是3.25.2,clang版本是17.0.6。
你看看这个吧。
报错的是几个标准库里面的东西找不到。应该是哪里设置有问题。
1 个赞
在编译 TiFlash 时遇到的问题可能由以下几个原因导致:
-
CMake 版本过低:
- 根据搜索结果,TiFlash 编译需要 CMake 版本在 3.21.0 及以上 。您当前使用的 CMake 版本是 3.25.2,满足版本要求,因此这个问题应该不是由 CMake 版本过低引起的。
-
编译器版本不兼容:
- 编译 TiFlash 时推荐使用 gcc 7.x 与 clang 13+。您使用的 clang 版本是 17.0.6,理论上是兼容的,但可能存在某些特定版本间的兼容性问题。您可以尝试查看 TiFlash 的官方文档或 issue 跟踪器,看是否有关于 clang 17 版本的特定问题和解决方案 。
-
标准库方法被删除:
- 错误提示“no template named ‘vector’ in namespace ‘std’”和“no matching function for call to ‘min’”表明编译器找不到标准库中的某些模板和函数。这通常是由于编译器配置错误或使用了不兼容的编译器版本导致的。您需要确保编译器和标准库是兼容的,并且正确配置了编译器的参数。
-
编译选项问题:
- 您提到的错误可能与编译选项有关,特别是与
-Werror
选项相关,这个选项会将所有的警告当作错误处理。您可能需要检查编译命令中是否包含了这个选项,并考虑移除它或者调整编译器的警告设置。
- 您提到的错误可能与编译选项有关,特别是与
-
库的混用问题:
- 如果您的系统中同时存在
libstdc++
和libc++
,可能会导致编译失败。您需要确保编译时使用的是同一版本的标准库。可以通过ldd
命令检查二进制文件和库文件的动态链接库依赖,以确认是否存在混用情况 。
- 如果您的系统中同时存在
-
模板实例化问题:
- 对于“implicit instantiation of undefined template”这类错误,通常是由于缺少相应的模板定义或者模板定义不可见导致的。您可能需要检查您的编译器版本是否支持所需的 C++ 标准,以及是否包含了所有必要的头文件。
感谢,我看一下