何时在C++中使用__declspec(dllexport)?

3

我正在制作一个DLL项目,并且不包括任何特定于编译器的宏。

导入者(.exe)文件编译干净,在导入我的DLL文件的方法后没有生成任何错误。它们位于不同的项目但同一解决方案中。

因为没有使用任何调用约定,所以我是否搞砸了事情?

我的DLL文件在命名空间中实现面向对象编程。

但有时或大多数情况下,.lib文件不会生成,因此我必须将我的DLL设置切换到LIB,并复制生成的.lib文件,然后再将其转回DLL文件。

而且我甚至不知道我使用的库是.dll还是.lib文件。

有人能清楚地向我解释一下吗?

编辑

我将添加一些我真正困惑的情况,即何时使用它。

假设我有以下内容:

namespace
{

    class Base abstract
    {

    public:
        Base()
        {
            //initialize base components
        }
        virtual void func() = 0;

    public:

        //interface
    };

    class Derive : public Base
    {

    public:
        Derive();
        void func() override;

    private:

        //interface

    };

}

我应该在这里使用 declspec(dllexport) 吗?
  • 构造函数(例如Base()Derive())?

  • 虚拟函数?我要把它放在派生类还是基类中?或者两个都要放?

  • 公共变量?(糟糕!)

我在其他头文件中看到他们添加了extern。我需要在这里添加吗?

这会破坏我所有的代码语法。

请回答....


我真的很讨厌那些只是浏览这篇文章,然后想着:“我不懂这个东西” -> [最好是点个踩] 而不留下任何评论的人。就是这样... - mr5
你假设只有不知道dllexport是什么才会给你的回答点踩,这样想可能有些牵强... ;-] - ildjarn
不过我真正的意思是,他们只是太懒了,不想读我在这里说的所有细节。我只是表达得不够清楚。 - mr5
1个回答

3

看起来你是将本应在dll中的库文件链接进去了。所以你根本没有使用dll。所有的东西都进入了exe文件。

微软要求在dll中使用__declspec(dllexport),在exe中使用__declspec(dllimport)。这变得很复杂,因此有宏来解决这个问题。

CLASS_DECLSPEC

编译器会对__declspec进行分类,以确定使用哪一个。
参见:http://msdn.microsoft.com/en-us/library/8fskxacy(v=vs.80).aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接