使用clang/clang++编译时出错[-Werror,- wrange -loop- construccut].&l



我正在尝试构建一个c++项目。在使用g++这样做时,项目可以很好地编译。但是,如果我尝试用clang编译,我会得到错误:

ec_read_plan.h:135:19: error: loop variable 'op' creates a copy from type 'const std::pair<ChunkPartType, ReadPlan::ReadOperation>' [-Werror,-Wrange-loop-construct]
for (const auto op : read_operationss_{
ec_read_plan.h:135:8: note: use reference type 'const std:pair<ChunkPartType, ReadPlan::ReadOperation> &' to prevent copying
for (const auto op : read_operations) {

代码如下,我在给出错误的行旁边放了一个注释:

protected:
void recoverParts(uint8_t *buffer,
const std::bitset<Goal::Slice::kMaxPartsCount> &available_parts) const {
typedef ReedSolomon<slice_traits::ec::kMaxDataCount, slice_traits::ec::kMaxParityCount> RS;
int k = slice_traits::ec::getNumberOfDataParts(slice_type);
int m = slice_traits::ec::getNumberOfParityParts(slice_type);
int max_parts = k + m;
RS::ConstFragmentMap data_parts{{0}};
RS::FragmentMap result_parts{{0}};
RS::ErasedMap erased;
RS rs(k, m);
int available_count = 0;
for (int i = 0; i < max_parts; ++i) {
if (!available_parts[i] || available_count >= k) {
erased.set(i);
} else {
available_count++;
}
}
for (const auto op : read_operations) {  //ERROR appears to be here
data_parts[op.first.getSlicePart()] = buffer + op.second.buffer_offset;
}
for (int i = 0; i < (int)requested_parts.size(); ++i) {
if (!available_parts[requested_parts[i].part]) {
result_parts[requested_parts[i].part] = buffer + i * buffer_part_size;
}
}
rs.recover(data_parts, erased, result_parts, buffer_part_size);
}

为什么我得到这样的错误与Clang,我怎么能解决这个问题?谢谢你。

对于任何想要重现错误的人,源代码在这里:https://github.com/lizardfs/lizardfs。后来做的事:

export CC=/usr/bin/clang
export CC=/usr/bin/clang++
cd lizardfs
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/lizardfs
make

原来这个错误与clang和clang++版本有关。如前所述,gcc在编译时没有问题。默认情况下,我的机器使用clang/clang++版本10。我尝试使用11版,但也有同样的问题。因此,我安装了clang/clang++的9版,并再次尝试编译,它工作了。

如果您碰巧遇到同样的问题,请确保运行以下命令或将它们放在~/.bashrc文件中,并在安装clang/clang++版本9后运行source ~/.bashrc

export CC=/usr/bin/clang-9
export CC=/usr/bin/clang++-9

最新更新