c++:不允许定义dllimport函数,使用visual studio 2010构建

c++: definition of dllimport function not allowed, building with visual studio 2010

本文关键字:visual 使用 studio 2010 构建 函数 不允许 定义 dllimport c++      更新时间:2023-10-16

我正在使用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上表达赞赏是一个问题,但我觉得不这样做是不礼貌的。请原谅我因这些行而造成的任何效率低下。)

VS属性表中的"用户宏"与预处理器宏无关。将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中。我以为你把它放在标题的顶部进行试用。先试试看效果如何。然后你可以在找到合适的位置后将其移除。

相关文章: