在同一项目中使用两个不同的数学库会混淆Visual C++



我的项目需要同时使用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.hC版本,所以#include <cmath>

最新更新