如何解决使用 clang/clang++ 编译时出错 [-Werror,-Wrange-loop-constrcut]
我正在尝试构建一个 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 版并再次尝试编译,结果成功了。
如果您碰巧遇到同样的问题,请确保在安装了 clang/clang++ 版本 9 后运行以下命令或将它们放在 ~/.bashrc
文件中并运行 source ~/.bashrc
export CC=/usr/bin/clang-9
export CC=/usr/bin/clang++-9
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。