我的项目需要同时使用Micorsoft Visual C++math.h
和"英特尔MKLmath.h
"。
建筑与详细的细节,我得到:
1> Note: including file: C:Program Files (x86)Microsoft Visual Studio 12.0VCincludecmath
1> Note: including file: E:3rdPartyMKL2017.1.143windowscompilerincludemath.h
1> Note: including file: C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude../../vc/include/math.h
1> Note: including file: C:Program Files (x86)Microsoft Visual Studio 12.0VCincludecrtdefs.h
1> E:3rdPartyMKL2017.1.143windowscompilerincludemath.h(1577): warning C4005: 'HUGE_VALF' : macro redefinition
1> C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude../../vc/include/math.h(104) : see previous definition of 'HUGE_VALF'
1> E:3rdPartyMKL2017.1.143windowscompilerincludemath.h(1579): warning C4005: 'HUGE_VALL' : macro redefinition
1> C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude../../vc/include/math.h(105) : see previous definition of 'HUGE_VALL'
1> E:3rdPartyMKL2017.1.143windowscompilerincludemath.h(1581): warning C4005: 'HUGE_VAL' : macro redefinition
1> C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude../../vc/include/math.h(96) : see previous definition of 'HUGE_VAL'
"'HUGE_VALF':宏重新定义"的消息让我产生了怀疑。
起初,我只是禁用了这个警告,但考虑到这个选项只会掩盖潜在的问题,我正在寻找替代解决方案。
从第1行和第2行中,您可以看到Visual Studio的cmath
不包括Visual Studio的math.h
,而是包含MKL的同名文件。
如何设置我的CMakeLists.txt
文件,以便编译器可以选择正确的包含文件?
只包装一个库。
例如,创建头文件:
#pragma once
namespace imath {
double sin(double a);
}
在cpp 中
#include "Wrapper.h"
#include <intel/math.h>
namespace imath {
double sin(double a) {
return ::sin(a);
}
}
对需要在公共源中使用的每个符号都执行此操作。
并且不要包括您正在使用C++的math.h
的C
版本,所以#include <cmath>
。