Использование двух разных математических библиотек в одном проекте сбивает с толку Visual C ++ - PullRequest
1 голос
/ 12 марта 2020

Мой проект должен использовать как 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 файл, чтобы компилятор мог правильно выбрать файлы для включения?

1 Ответ

1 голос
/ 12 марта 2020

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

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

#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>.

...