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, чтобы поставить оценку в вопрос, я чувствую себя невежливым не делать этого. Простите меня за любую неэффективность, вызванную этими строками.)

679   3  

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

    Ничего не найдено.