c++: определение функции dllimport не разрешено, построение с помощью visual studio 2010

Я использую visual studio 2010 для создания .файл DLL. Я написал испытание так:

// trialDLL.h
#ifndef TRIALDLL_H_
#define TRIALDLL_H_

// ... MyMathFuncs class definition omitted

#ifdef __cplusplus
extern "C"{
#endif

#ifdef TRIALDLL_EXPORT
#define TRIALDLL_API __declspec(dllexport)
#else
#define TRIALDLL_API __declspec(dllimport)
#endif

TRIALDLL_API MyMathFuncs* __stdcall new_MyMathFuncs(double offset);
TRIALDLL_API void __stdcall del_MyMathFuncs(MyMathFuncs *myMath);
TRIALDLL_API double __stdcall MyAdd(MyMathFuncs* myMath, double a, double b);
// some other similar stuff

#ifdef __cplusplus
}
#endif

#endif

и triallDLL.файл cpp:

// trialDLL.cpp
#include "trialDLL.h"

TRIALDLL_API MyMathFuncs* __stdcall new_MyMathFuncs(double offset)
{
    return new MyMathFuncs(offset);
}

TRIALDLL_API void __stdcall del_MyMathFuncs(MyMathFuncs *myMath)
{
    delete myMath;
}

TRIALDLL_API double __stdcall MyAdd(MyMathFuncs *myMath, double a, double b)
{
    return myMath->Add(a, b);
}
// ... some other definitions

С этими двумя файлами в проекте я добавил лист свойств в проект через диспетчер свойств visual studio 2010 и добавил TRIALDLL_EXPORT макросы пользователя. После всего этого хороший Intellisense дает мне ошибку для каждой функции, определенной в.cpp-файл и жалуется "ошибка: функция, объявленная "dllimport", не может быть определена". Получается, что IntelliSense не найти TRIALDLL_EXPORT определенными. Я думал, что это может иметь значение, если я действительно создам проект, но результат предполагает ту же ошибку: "ошибка C2491: 'new_MyMathFuncs' : определение функции dllimport не разрешено". Тогда понятно, что макрос TRIALDLL_EXPORT все еще не определено во время компиляции.

после неудачного добавления макроса через visual studio я также попытался поместить строку кода:#define TRIALDLL_EXPORT в trialDLL.cpp, но это не помогло. Интересно как правильно это сделать? Как сообщить компилятору, что микро определяется так, что TRIALDLL_API оценивает в dllexport, а не dllimport?

кроме того, если я могу построить.dll успешно, есть ли какой-либо систематический способ проверить/проверить функциональность .dll файлы?

Спасибо за любую помощь заранее! (Хотя я знаю, что здесь, на stackoverflow, это проблема, чтобы поставить оценку в вопрос, я чувствую себя невежливым не делать этого. Прости меня за любую неэффективность. вызвано этими линиями.)

3 ответов


"пользовательские макросы" в листах свойств VS не имеют ничего общего с макросами препроцессора. Положи TRIALDLL_EXPORT в окне свойств в разделе C/C++ > Preprocessor > Preprocessor Definitions

"пользовательские макросы", которые могут быть определены только в таблицах свойств, позволяют создавать собственные" переменные", используемые в свойствах Visual Studio, аналогичные встроенным $(TargetName), $(SolutionDir) etc.


поставить

#error Where is my macro?

на #else блок заголовка. Затем поэкспериментируйте с настройками проекта или #define пока вы не получите это право. Возможно, вы добавили лист свойств только в одну конфигурацию? Вы поставили #define в верхней части файла? У вас есть какие-либо вещи PCH, которые заставляют его игнорировать ваши настройки? И так далее.


код выглядит нормально и должен работать, если TRIALDLL_EXPORT действительно определен. Вы, скорее всего, испортили это как-то (например, установили его для другой конфигурации или только для одного файла) или не перестроили.

Если вы полностью потерялись, попросите выход препроцессора и посмотрите на это. Как с define не может быть dllimport вокруг вообще, ошибка также невозможна.

EDIT: я только что заметил, что вы написали _I также попытался поместить строку кода: #define TRIALDLL_EXPORT in_ trialDLL.cpp. Я думал, вы поместили его в начало заголовка для суда. Попробуйте сначала, чтобы убедиться, что он работает нормально. Затем вы можете удалить его после того, как нашли подходящее место.