使用vcpkg安装PCL后导入头文件出现__builtin_ia32_foo未声明编译错误
PCL导入时触发Eigen指令集相关编译错误的解决方法
本人主要熟悉Python,对C++及编译知识陌生。按PCL官方推荐用vcpkg执行vcpkg install pcl:x64-windows安装PCL后,只要导入任意PCL库,就会出现大量__builtin_ia32前缀相关编译错误,疑似源于PCL依赖的Eigen库。此前未导入PCL的代码可正常编译。
编译错误示例
====================[ Build | FallingRockDetectionPC | Debug ]================== "C:\Program Files\JetBrains\CLion 2022.3\bin\cmake\win\bin\cmake.exe" --build C:\...\Projects\FallingRockDetectionPC\cmake-build-debug --target FallingRockDetectionPC -j 16 [1/3] Building CXX object CMakeFiles/FallingRockDetectionPC.dir/main.cpp.obj FAILED: CMakeFiles/FallingRockDetectionPC.dir/main.cpp.obj C:\PROGRA~1\JETBRA~1\CLION2~1.3\bin\mingw\bin\G__~1.EXE -DDISABLE_PNG -D__SSE2__ -D__SSE3__ -D__SSE4_1__ -D__SSE4_2__ -D__SSE__ -D__SSSE3__ -isystem C:/.../Programs/vcpkg/installed/x64-windows/include -isystem C:/.../Programs/vcpkg/installed/x64-windows/include/eigen3 -g -fdiagnostics-color=always -MD -MT CMakeFiles/FallingRockDetectionPC.dir/main.cpp.obj -MF CMakeFiles\FallingRockDetectionPC.dir\main.cpp.obj.d -o CMakeFiles/FallingRockDetectionPC.dir/main.cpp.obj -c C:/.../Projects/FallingRockDetectionPC/main.cpp In file included from C:/Users/samue/Programs/vcpkg/installed/x64-windows/include/Eigen/src/Core/util/ConfigureVectorization.h:349, from .../vcpkg/installed/x64-windows/include/Eigen/Core:22, from .../vcpkg/installed/x64-windows/include/pcl/memory.h:48, from .../vcpkg/installed/x64-windows/include/pcl/io/pcd_io.h:42, . . . ...\mingw64\lib\gcc\x86_64-w64-mingw32\12.2.0\include\pmmintrin.h: In function '__m128 _mm_addsub_ps(__m128, __m128)': ...\mingw64\lib\gcc\x86_64-w64-mingw32\12.2.0\include\pmmintrin.h:53:19: error: '__builtin_ia32_addsubps' was not declared in this scope; did you mean '__builtin_ia32_subps'? 53 | return (__m128) __builtin_ia32_addsubps ((__v4sf)__X, (__v4sf)__Y); | ^~~~~~~~~~~~~~~~~~~~~~~ | __builtin_ia32_subps
已尝试的解决步骤
- 使用x64版本CMake重新编译vcpkg中的PCL
- 将CLion自带MinGW替换为外部最新版本
- 彻底删除vcpkg及相关文件夹后重新安装PCL(此前误装x86版本包)
项目CMakeLists.txt内容
cmake_minimum_required(VERSION 3.24) project(FallingRockDetectionPC) find_package(PCL CONFIG REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) set(CMAKE_CXX_STANDARD 17) add_executable(FallingRockDetectionPC main.cpp load_sequential_pc.cpp load_sequential_pc.h) target_link_libraries(FallingRockDetectionPC PRIVATE ${PCL_LIBRARIES})
可行解决方案
错误根源是PCL通过${PCL_DEFINITIONS}传递了强制启用SSE指令集的宏,但MinGW在部分环境下无法正确识别这些指令集内置函数。可按以下步骤修复:
1. 移除自动添加的指令集宏
在CMakeLists.txt中删除add_definitions(${PCL_DEFINITIONS}),避免强制开启不兼容的指令集优化。
2. 手动指定兼容的编译选项
如果需要保留基础优化,可手动添加大部分CPU都支持的SSE2指令集:
# 替换原add_definitions(${PCL_DEFINITIONS}) target_compile_options(FallingRockDetectionPC PRIVATE -msse2)
3. 确保工具链一致性
使用MinGW专属的vcpkg triplet重新安装PCL,保证编译工具链统一:
set VCPKG_TARGET_TRIPLET=x64-windows-mingw vcpkg install pcl:x64-windows-mingw
然后在CLion的CMake配置中指定vcpkg工具链文件:
set(CMAKE_TOOLCHAIN_FILE "C:/.../Programs/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
4. 兜底方案:禁用Eigen向量优化
如果以上方法无效,可强制Eigen不使用SIMD优化:
add_definitions(-DEIGEN_DONT_VECTORIZE)
内容的提问来源于stack exchange,提问作者scrams
相关产品推荐
相关产品推荐

