Ошибка C2470 Visual Studio 2012 и Qt 4.8.6

Я делаю небольшую библиотеку для своих нужд R&D. Для этого я использую Qt 4.8.6 и Visual Stuido 2012.


Вот мой .pro файл

TEMPLATE    = lib
TARGET      = mylib
CONFIG      += dll

HEADERS = mymath.h

SOURCES = mymath.cpp \

INCLUDEPATH +=  ../include \

DEFINES += MYMATHIMPL

Вот .h файл с моим классом

#ifndef MY_MATH_H
#define MY_MATH_H

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <float.h>


#if defined(MYMATHIMPL)
# define MYMATHAPI Q_DECL_EXPORT
#else
# define MYMATHAPI Q_DECL_IMPORT
#endif

typedef struct
{
  double * b;
  double * c;
  double * d;
  double * _m;
} akima_state_t;

class MYMATHAPI AkimaInterpolator
{
public:
    AkimaInterpolator(double * _x_values, double * _y_values, size_t size);
    AkimaInterpolator(double *d, double *c, double* b, double *_x_values, double* _y_values, size_t _size);
    ~AkimaInterpolator();
    double evaluateAtX(double x);
    static int searchIndex(const double sortedArray[], double toFind, int len);
};

.cpp содержит все объявленные методы с реализацией.
Но когда я пытаюсь собрать эту библиотеку, у меня возникает ошибка:

mymath.h(31): ошибка C2470: AkimaInterpolator:: выглядит как определение функции, но нет списка параметров; пропуская видимое тело.

Я проверил флаги компилятора, и кажется, что MYMATHIMPL установлен.

cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DACPMATHIMPL -D_DEBUG -D__STDC_LIMIT_MACROS -D__ST
    DC_FORMAT_MACROS -DSPM_VERSION_INFO -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -D
    QT_THREAD_SUPPORT -I"c:\Qt\4.8.6\include\QtCore" -I"c:\Qt\4.8.6\include\QtGui" -I"c:\Qt\4.8.6\include" -I"..\include" -I"..\..\common\include" -I"-I"..\..\common\include" -I"..\
    ..\common\include" -I"c:\Qt\4.8.6\include\ActiveQt" -I"..\..\..\temp\acp_v2\debug" -I"c:\Qt\4.8.6\mkspecs\win32-msvc2012" -Fo..\..\..\temp\acp_v2\debug\ @C:\Users\admin\AppData\Local\Temp\nmC62D.tmp

Что я делаю неправильно? Зачем блокировать:

#if defined(MYMATHIMPL)
    # define MYMATHAPI Q_DECL_EXPORT
#else
    # define MYMATHAPI Q_DECL_IMPORT
#endif

не работает, как ожидалось?


person tema    schedule 13.04.2015    source источник
comment
Потому что Q_DECL_EXPORT не определен?   -  person n. 1.8e9-where's-my-share m.    schedule 13.04.2015
comment
@н.м. это выглядит так, но я не могу понять, почему Q_DECL_EXPORT не определено. Это должно быть определено из-за последнего отмеченного блока   -  person tema    schedule 13.04.2015
comment
@tema: Нет, это определяет MYMATHAPI, а не любой из макросов Q_DECL.   -  person Mike Seymour    schedule 13.04.2015
comment
в заголовке указано VS2015, но в тексте вашего вопроса упоминается VS2012.   -  person AndersK    schedule 13.04.2015
comment
@CyberSpock, спасибо, исправлено.   -  person tema    schedule 13.04.2015


Ответы (1)


Вы не включили заголовки QT, которые могли бы определять Q_DECL_EXPORT или Q_DECL_IMPORT, и они не определены командной строкой. Таким образом, ваше использование MYMATHAPI расширяется до Q_DECL_EXPORT, а не до того, на что это должно распространяться.

Я думаю, что они определены в <QtGlobal>.

person Mike Seymour    schedule 13.04.2015
comment
Спасибо, я пропустил QT += core в .pro файле. Добавление #include <QtCore> в mymath.h и редактирование файла .pro решили эту проблему. Я проверю ответ, как только это будет возможно. - person tema; 13.04.2015