TiFlash编译问题

我尝试按照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 时遇到的问题可能由以下几个原因导致:

  1. CMake 版本过低

    • 根据搜索结果,TiFlash 编译需要 CMake 版本在 3.21.0 及以上 。您当前使用的 CMake 版本是 3.25.2,满足版本要求,因此这个问题应该不是由 CMake 版本过低引起的。
  2. 编译器版本不兼容

    • 编译 TiFlash 时推荐使用 gcc 7.x 与 clang 13+。您使用的 clang 版本是 17.0.6,理论上是兼容的,但可能存在某些特定版本间的兼容性问题。您可以尝试查看 TiFlash 的官方文档或 issue 跟踪器,看是否有关于 clang 17 版本的特定问题和解决方案 。
  3. 标准库方法被删除

    • 错误提示“no template named ‘vector’ in namespace ‘std’”和“no matching function for call to ‘min’”表明编译器找不到标准库中的某些模板和函数。这通常是由于编译器配置错误或使用了不兼容的编译器版本导致的。您需要确保编译器和标准库是兼容的,并且正确配置了编译器的参数。
  4. 编译选项问题

    • 您提到的错误可能与编译选项有关,特别是与 -Werror 选项相关,这个选项会将所有的警告当作错误处理。您可能需要检查编译命令中是否包含了这个选项,并考虑移除它或者调整编译器的警告设置。
  5. 库的混用问题

    • 如果您的系统中同时存在 libstdc++libc++,可能会导致编译失败。您需要确保编译时使用的是同一版本的标准库。可以通过 ldd 命令检查二进制文件和库文件的动态链接库依赖,以确认是否存在混用情况 。
  6. 模板实例化问题

    • 对于“implicit instantiation of undefined template”这类错误,通常是由于缺少相应的模板定义或者模板定义不可见导致的。您可能需要检查您的编译器版本是否支持所需的 C++ 标准,以及是否包含了所有必要的头文件。

感谢,我看一下

报错信息里用到的gcc是/usr/bin/…/lib/gcc/x86_64-linux-gnu/9,我猜测可能是gcc的版本问题,但是我自己编译了一个gcc-13.1命名为13放到这个文件夹底下没有其效果,改变环境变量也没有用,请问有什么办法可以指定编译时使用哪个gcc吗?

粗暴一点的办法就是把9改个名字,把13改成9.将错就错。

至于正经的做法其实也就是改环境变量,改cmakelist文件,在命令行中加参数指定。这3个方法。
鉴于你已经使用了其中的一种没有效果,另外2种的效果也可能十分有限,不如想上面那样来个简单粗暴的方法。编译完了改回来就好了。

改cmake

set(CMAKE_C_COMPILER “/path/to/gcc-13”) # 替换为实际的路径
set(CMAKE_CXX_COMPILER “/path/to/g+±13”) # 替换为实际的路径

设置命令行

cmake -DCMAKE_C_COMPILER=gcc-13 -DCMAKE_CXX_COMPILER=g+±13 …

直接将13改成9的话,编译时会选择同目录下其他版本。
我换了下下载源,apt装了个11,这样倒是能让这个目录有11,但是现在因为下载源的版本高于系统版本,导致出了一大堆莫名其妙的依赖问题,连前面装好的东西比如clang什么的也丢掉、装不上了,修依赖的时候磁盘又出问题了……
这块我可能暂时搁置了,感谢您的回复

1 个赞

重重难关啊 :rofl:
不如找个外网云主机,弄个干净的环境重新开始可能更快。
这种配置细节上的问题,搞起来最令人头秃。

1 个赞

第一种错误提示“implicit instantiation of undefined template ‘std::tuple<std::basic_string, std::basic_string, bool>’”,这通常是因为编译器不支持C++11标准中的std::tuple 特性。您使用的Clang版本是17.0.6,理论上应该支持C++11特性,但可能需要确保编译时使用了正确的C++标准版本。在编译时使用-std=c++17 或更高版本应该可以解决这个问题