VS2019编译CMake项目报C1083找不到Eigen/Core及std::hash重定义求解
CMake C++项目编译问题解决方案
MinGW下找不到lboost_*库解决步骤
- 确认使用的Boost库是对应MinGW编译器编译的版本,不可混用MSVC编译的Boost库,否则链接阶段无法识别库格式
- 在CMakeLists.txt中显式指定Boost搜索参数,避免CMake走默认路径找错库:
set(BOOST_ROOT "替换为你本地Boost库的根目录路径") set(Boost_NO_SYSTEM_PATHS ON) set(Boost_USE_STATIC_LIBS ON) # 若使用静态Boost库请开启,动态库则改为OFF set(Boost_ARCHITECTURE "-x64") # 编译64位程序时添加,32位改为"-x32" find_package(Boost REQUIRED COMPONENTS 替换为你实际用到的Boost组件名,如system、thread等) include_directories(${Boost_INCLUDE_DIRS})
- 检查系统环境变量中的MinGW路径,确保只有你当前使用的对应架构(32/64位)的MinGW路径在Path列表中,避免CMake识别错编译器。
Visual Studio Build Tools 2019编译报错解决步骤
C1083 找不到eigen3/Eigen/Core头文件
- 不要直接修改Eigen源码中的include语句,调整CMake包含路径配置即可:如果你项目中的Eigen存放路径为
third_party/eigen3,需要将eigen3的上层目录加入包含路径,而非eigen3目录本身,示例配置:
include_directories("third_party")
该配置可让#include <eigen3/Eigen/Core>语句正确定位到目标文件,同时不会破坏Eigen本身的头文件依赖结构。
C2766 std::hash显式特化重复定义
该问题根因为项目同时引入了两个版本的Eigen库:项目自带的third_party下的eigen3,以及Python37目录下TensorFlow自带的Eigen库,两个版本都对std::hash做了特化导致冲突,按以下步骤排查:
- 调整CMake包含路径的顺序,将你项目的third_party目录放在TensorFlow包含路径之前,优先使用项目自带的Eigen版本
- 显式过滤自动搜索到的Python目录下的TensorFlow头文件路径,避免冲突:
list(FILTER CMAKE_INCLUDE_PATH EXCLUDE REGEX "Python37/Lib/site-packages/tensorflow/include") list(FILTER CMAKE_SYSTEM_INCLUDE_PATH EXCLUDE REGEX "Python37/Lib/site-packages/tensorflow/include")
- 若项目本身依赖TensorFlow头文件,则统一使用TensorFlow自带的Eigen库,移除项目中自带的eigen3依赖,避免版本冲突
- 若调整路径后仍报错,可在项目预处理器定义中添加
EIGEN_NO_HASH_SPECIALIZATION宏,禁用Eigen自带的std::hash特化即可。
内容的提问来源于stack exchange,提问作者shayan Hojati
相关产品推荐
相关产品推荐

