c++: определение функции dllimport не допускается, построение с помощью visual studio 2010
Я использую visual studio 2010 для построения a .файл 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
И триаллл.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.но это тоже не помогло. Интересно, Как правильно это сделать? Как сообщить компилятору, что микро определен таким образом, что TRIALDLL_API вычисляется как dllexport, а не dllimport?
Также, если я могу построить .dll успешно, есть ли какой-либо систематический способ проверить / проверить функциональность .dll?
Заранее спасибо за любую помощь! (Хотя я знаю, что это проблема здесь, на stackoverflow, чтобы поставить оценку в вопрос, я чувствую себя невежливым не делать этого. Простите меня за любую неэффективность, вызванную этими строками.)
3 ответов:
"пользовательские макросы" в таблицах свойств VS не имеют ничего общего с макросами препроцессора. Поместите
TRIALDLL_EXPORTв раздел листа свойствC/C++ > Preprocessor > Preprocessor Definitions"пользовательские макросы", которые могут быть определены только в таблицах свойств, позволяют создавать собственные "переменные", используемые в свойствах Visual Studio, аналогичные встроенным
$(TargetName),$(SolutionDir)и т.д.
Put
#error Where is my macro?В блоке
#elseзаголовка. Затем поэкспериментируйте с настройками проекта или#define, пока не получите все правильно. Возможно, вы добавили лист свойств только к одной конфигурации? Вы поместили#defineв самом верху файла? Есть ли у вас какие-либо PCH вещи, которые заставляют его игнорировать ваши настройки? И так далее.
Код выглядит нормально и должен работать, если TRIALDLL_EXPORT действительно определен. Вы, скорее всего, испортили это каким-то образом (например, установили его для другой конфигурации или только для одного файла) или не перестроили.
Если вы полностью потерялись, запросите выходные данные препроцессора и посмотрите на это. Поскольку с define не может быть dllimport вообще, ошибка также невозможна.
EDIT: я только что заметил, что вы написали _I также пытались вставить строку кода: #define TRIALDLL_EXPORT в_ триалдлл.cpp . Я думал, ты положил его сверху заголовка для суда. Попробуйте это сначала, чтобы убедиться, что это работает нормально. Затем вы можете удалить его после того, как найдете подходящее место.
Comments