Использование двух разных математических библиотек в одном проекте приводит к путанице в Visual C++.

В моем проекте необходимо использовать как Micorsoft Visual C++ math.h, так и Intel MKL math.h.

Строя с подробными деталями, я получаю:

1>  Note: including file:        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\cmath
1>  Note: including file:         E:\3rdParty\MKL\2017.1.143\windows\compiler\include\math.h
1>  Note: including file:          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\../../vc/include/math.h
1>  Note: including file:           C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdefs.h
1>  E:\3rdParty\MKL\2017.1.143\windows\compiler\include\math.h(1577): warning C4005: 'HUGE_VALF' : macro redefinition
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\../../vc/include/math.h(104) : see previous definition of 'HUGE_VALF'
1>  E:\3rdParty\MKL\2017.1.143\windows\compiler\include\math.h(1579): warning C4005: 'HUGE_VALL' : macro redefinition
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\../../vc/include/math.h(105) : see previous definition of 'HUGE_VALL'
1>  E:\3rdParty\MKL\2017.1.143\windows\compiler\include\math.h(1581): warning C4005: 'HUGE_VAL' : macro redefinition
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\../../vc/include/math.h(96) : see previous definition of 'HUGE_VAL'

Сообщение «HUGE_VALF: переопределение макроса» вызвало у меня подозрения.

Сначала я просто отключил это предупреждение, но, учитывая, что эта опция только маскирует потенциальную проблему, я ищу альтернативное решение.

Из строк 1 и 2 видно, что cmath Visual Studio включает не math.h Visual Studio, как следовало бы, а файл MKL с тем же именем.

Как я могу настроить свой файл CMakeLists.txt, чтобы компилятор мог выбрать правильные включаемые файлы?


person Pietro    schedule 12.03.2020    source источник
comment
Посмотрите в своем проекте Properties\Configuration Properties\C/C++\General и верхнюю запись Additional Include Directories. E:\3rdParty\MKL\2017.1.143\windows\compiler\include здесь? Если это так, попробуйте поставить C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include; перед ним (если math.h есть даже в этом каталоге, вам лучше проверить).   -  person Ted Lyngmo    schedule 12.03.2020
comment
@TedLyngmo - пути уже отсортированы, как вы указали. Я подтверждаю, что math.h находится в этом каталоге include.   -  person Pietro    schedule 13.03.2020
comment
Хорошо, есть ли какие-то #ifdef в файле cmath, которые не позволяют cmath #include писать math.h?   -  person Ted Lyngmo    schedule 13.03.2020


Ответы (1)


Просто оберните одну библиотеку.

Например, создайте заголовочный файл:

#pragma once

namespace imath {
    double sin(double a);
}

И в цпп

#include "Wrapper.h"
#include <intel/math.h>

namespace imath {
    double sin(double a) {
        return ::sin(a);
    }
}

Сделайте это для каждого символа, который вам нужно использовать в общем источнике.

И не включайте C версию math.h, которую вы используете C++, поэтому #include <cmath>.

person Marek R    schedule 12.03.2020