再记【fatal error C1001: 内部编译器错误】的一个原因

平台:Windows 11、Visual Studio 2022

报错信息

已启动生成...
1>------ 已启动生成: 项目: PointMatchingModel, 配置: Debug x64 ------
1>PointMatchingModel.cpp
1>C:\tools\vcpkg\installed\x64-windows\include\pcl\registration\impl\ia_fpcs.hpp(236,1): fatal  error C1001: 内部编译器错误。
1>(编译器文件“D:\a\_work\1\s\src\vctools\Compiler\CxxFE\sl\p1\c\error.h”,第 1298)
1> 要解决此问题,请尝试简化或更改上面所列位置附近的程序。
1>如果可以,请在此处提供重现步骤: https://developercommunity.visualstudio.com
1>请选择 Visual C++
1>“帮助”菜单上的“技术支持”命令,或打开技术支持帮助文件来获得详细信息。
1>已完成生成项目“PointMatchingModel.vcxproj”的操作 - 失败。
========== 生成: 0 成功,1 失败,0 最新,0 已跳过 ==========
========= 生成 开始于 15:02,并花费了 06.996 秒 ==========

问题分析

该问题类型为内部编译器错误。

但 Visual Studio 并没有检测出代码的语法问题。

导致这个问题的原因比较多,但缺乏足够有用的信息,只能一点点检查。

在《【fatal error C1001: 内部编译器错误】的一个原因》里,我提到是自己写的一个 Lambda 表达式中没写分号 ;

但这次的问题出现在 pcl\registration\impl\ia_fpcs.hpp 上,这是 PCL 官方的文件,讲道理不可能出问题。

国内的网站上无法检索相关的解决办法,所以尝试在外网找找,那就需要先把 Visual Studio 2022 改成英文,然后用英文的报错信息去搜索。

于是按照《Visual studio的中英文切换》中的方式切换为了中文,然后对项目重新编译了一下,希望得到英文版的报错信息后,在外网搜搜。但此时 VS 提供的报错信息的内容比中文版时更丰富了

Build started...
1>------ Build started: Project: PointMatchingModel, Configuration: Debug x64 ------
1>PointMatchingModel.cpp
1>C:\tools\vcpkg\installed\x64-windows\include\pcl\registration\impl\ia_fpcs.hpp(225,7): error C2760: syntax error: '}' was unexpected here; expected 'statement'
1>Done building project "PointMatchingModel.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Build started at 15:12 and took 11.141 seconds ==========

找了一下,没找到原因。

看一下 ia_fpcs.hpp 的代码(含行号):

165 ///
166 template <typename PointSource, typename PointTarget, typename NormalT, typename Scalar>
167 void
168 pcl::registration::FPCSInitialAlignment<PointSource, PointTarget, NormalT, Scalar>::
169     computeTransformation(PointCloudSource& output, const Eigen::Matrix4f& guess)
170 {
171   if (!initCompute())
172     return;
173 
174   final_transformation_ = guess;
175   bool abort = false;
176   std::vector<MatchingCandidates> all_candidates(max_iterations_);
177   pcl::StopWatch timer;
178 
179 #pragma omp parallel default(none) shared(abort, all_candidates, timer)                \
180     num_threads(nr_threads_)
181   {
182 #ifdef _OPENMP
183     const unsigned int seed =
184         static_cast<unsigned int>(std::time(NULL)) ^ omp_get_thread_num();
185     std::srand(seed);
186     PCL_DEBUG("[%s::computeTransformation] Using seed=%u\n", reg_name_.c_str(), seed);
187 #pragma omp for schedule(dynamic)
188 #endif
189     for (int i = 0; i < max_iterations_; i++) {
190 #pragma omp flush(abort)
191 
192       MatchingCandidates candidates(1);
193       pcl::Indices base_indices(4);
194       all_candidates[i] = candidates;
195 
196       if (!abort) {
197         float ratio[2];
198         // select four coplanar point base
199         if (selectBase(base_indices, ratio) == 0) {
200           // calculate candidate pair correspondences using diagonal lengths of base
201           pcl::Correspondences pairs_a, pairs_b;
202           if (bruteForceCorrespondences(base_indices[0], base_indices[1], pairs_a) ==
203                   0 &&
204               bruteForceCorrespondences(base_indices[2], base_indices[3], pairs_b) ==
205                   0) {
206             // determine candidate matches by combining pair correspondences based on
207             // segment distances
208             std::vector<pcl::Indices> matches;
209             if (determineBaseMatches(base_indices, matches, pairs_a, pairs_b, ratio) ==
210                 0) {
211               // check and evaluate candidate matches and store them
212               handleMatches(base_indices, matches, candidates);
213               if (!candidates.empty())
214                 all_candidates[i] = candidates;
215             }
216           }
217         }
218 
219         // check terminate early (time or fitness_score threshold reached)
220         abort = (!candidates.empty() ? candidates[0].fitness_score < score_threshold_
221                                      : abort);
222         abort = (abort ? abort : timer.getTimeSeconds() > max_runtime_);
223 
224 #pragma omp flush(abort)
225       }
226     }
227   }
228 
229   // determine best match over all tries
230   finalCompute(all_candidates);
231 
232   // apply the final transformation
233   pcl::transformPointCloud(*input_, output, final_transformation_);
234 
235   deinitCompute();
236 }

根据错误提示,说是 '}' was unexpected here; expected 'statement',尝试把第 224 行注释掉了。然后再编译就成功了。

还是 不知道什么原因

教训:开发工具还是用英文比较好,报错的信息更全。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: fatal error c1001: internal compiler error编译器内部错误的一种,通常是由于编译器本身的问题导致的。这种错误通常需要开发人员对编译器进行调试和修复。建议您尝试更新编译器版本或联系编译器开发者以获取更多帮助。 ### 回答2: fatal error c1001: internal compiler error是由于Visual Studio编译器在处理代码时遇到了无法处理的内部错误而导致的编译失败。这个错误可能是由编译器本身的错误引起的,或者是由代码错误或异常引起的。下面是一些常见的导致编译器错误原因: 1. 代码的语法错误或逻辑错误: 代码错误或异常可能导致编译器无法正确处理代码。 2. 编译器软件本身的错误编译器软件本身有时会出现错误,并且可能无法正确处理某些代码或语法结构。 3. 编译器与编译环境的不匹配:编译器与某些库或操作系统不兼容时,可能会导致错误。 4. 代码文件损坏或缺失:代码文件已损坏或缺失的情况下,编译器可能无法正确处理代码。 为了解决fatal error c1001: internal compiler error,可以尝试以下方法: 1. 重新编译代码:尝试重新编译代码,以检查是否存在语法错误或逻辑错误。 2. 更新编译器:更新编译器软件,确保使用最新版本。 3. 更改编译环境:检查编译环境的设置与编译器的版本之间是否匹配,必要时更改。 4. 恢复丢失文件:恢复丢失的代码文件或替换可能损坏的代码。 如果以上方法没有解决问题,还可以使用其他编译器进行编译,或者通过将代码片段删除进行排查。如果问题仍然存在,可以尝试寻求帮助进行解决。 ### 回答3: fatal error c1001: internal compiler error一个由Visual C++编译器输出的错误信息,表明编译器在编译源代码时遇到了一个内部错误,导致编译失败。这通常是由编译器自身的错误引起的,而不是源代码的语法或逻辑错误。 这种错误通常很难调试,因为它没有提供有关发生错误的具体位置或原因的详细信息。但是,有几种可能的原因可能导致此错误: 1. 编译器已损坏或存在软件错误。在这种情况下,您可以尝试更新或重新安装Visual C++编译器,并确保使用最新版本的编译器。 2. 编译器资源不足。如果编译器无法分配足够的内存或其他系统资源来编译源代码,则可能会导致编译器错误。您可以尝试关闭其他正在运行的应用程序或增加系统RAM来解决此问题。 3. 源代码可能包含某些错误或不规范的语法,这可能会触发编译器内部错误。在这种情况下,您可以尝试检查源代码,并确保它符合正确的C++编码约定。 总之,遇到fatal error c1001: internal compiler error时,重要的是要先尝试各种解决方法,并排除可能的问题,以确保能够成功编译源代码。如果所有尝试都失败,请尝试与编译器开发人员或社区联系,以寻求更多的帮助和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值