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. Я думал, вы поместили его в начало заголовка для суда. Попробуйте сначала, чтобы убедиться, что он работает нормально. Затем вы можете удалить его после того, как нашли подходящее место.