c++:不允许定义dllimport函数,使用visual studio 2010构建
c++: definition of dllimport function not allowed, building with 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
在项目中有了这两个文件后,我通过visualstudio2010属性管理器向项目添加了属性表,并向用户宏添加了TRIALDLL_EXPORT
。在所有这些之后,漂亮的Intellisense为.cpp文件中定义的每个函数都给出了错误,并抱怨"错误:可能没有定义声明为"dllimport"的函数"。因此,Intellisense似乎没有找到定义的TRIALDLL_EXPORT
。我认为如果我真的构建了这个项目,可能会有所不同,但结果表明了同样的错误:"错误C2491:'new_MyMathFuncs':不允许定义dllimport函数"。那么很明显,在编译时仍然没有定义宏TRIALDLL_EXPORT
。
在通过visualstudio添加宏失败后,我还尝试在trialDLL.cpp中放入代码行:#define TRIALDLL_EXPORT
,但也无济于事。我想知道做这件事的正确方法是什么?如何通知编译器定义了micro,以便TRIALDLL_API
的计算结果为dllexport
而不是dllimport
?
此外,如果我能成功构建.dll,是否有任何系统的方法来测试/验证.dll的功能?
感谢您提前提供的帮助!(虽然我知道在stackoverflow上表达赞赏是一个问题,但我觉得不这样做是不礼貌的。请原谅我因这些行而造成的任何效率低下。)
TRIALDLL_EXPORT
放入属性表的C/C++ > Preprocessor > Preprocessor Definitions
部分
只能在属性表中定义的"用户宏"允许您创建自己的可在Visual Studio属性中使用的"变量",类似于内置的$(TargetName)
、$(SolutionDir)
等。
正如这篇Microsoft文章中所说,您不能应用__declspec(dllimport)
关键字来实现函数。您应该只在声明中使用它。例如:
// function declaration
void __declspec(dllimport) funcB();
// function definition
void funcB() {
//funcB code
}
放入
#error Where is my macro?
在报头的CCD_ 13块中。然后对项目设置或#define
进行实验,直到你做对为止。您是否可能只将属性表添加到一个配置中?你把#define
放在文件的最上面了吗?你有任何PCH的东西导致它忽略你的设置吗?等等。
代码看起来不错,如果实际定义了TRIALDLL_EXPORT,则必须正常工作。你很可能以某种方式搞砸了(比如为不同的配置或只为一个文件设置它),或者没有重建。
如果您完全迷失了方向,请询问预处理器的输出,然后查看它。与define一样,根本不可能有dllimport,错误也是不可能的。
编辑:我刚刚注意到你写了,我还试着把代码行:#define TRIALDLL_EXPORT放在_TRIALDLL.cpp中。我以为你把它放在标题的顶部进行试用。先试试看效果如何。然后你可以在找到合适的位置后将其移除。
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- 使用visual studio 2019正确设置tinycc,找不到库libtcc1-32.a
- 在Windows 10上使用Visual Studio 2019构建的Tesseract API c ++程序在Wind
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 使用 Visual Studio 2019 构建 Hello World wxwidgets 应用程序时出错
- visual使用fstream从C++中的*.txt文件中读取数字
- visual C++使用字符串流进行字符串到双精度转换会产生精度错误
- visual使用C++中的Point类创建一个类来计算圆的面积
- Visual C++ 使用成员选择运算符(. 或 –>)访问静态成员函数
- visual使用C++,我在创建一个类时会得到0xcdcdcd的指针——发生了什么
- visual C++:使用条件语句的控制台输出有缺陷
- visual使用不同编译器(C++)生成的二进制文件的速度差异太大
- visual使用不带回调的函数C++