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

时间:2013-03-09 14:06:01

标签: c++ visual-c++ c++11 dllexport

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

导入器(.exe)文件编译干净,导入DLL文件中的方法后没有生成错误。他们在不同的项目,但相同的解决方案。

由于没有使用任何调用约定,我在这里搞乱了吗?

我的DLL文件位于命名空间中,并以OOP方式实现。

但有时或大多数时候,.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)

  • constructors(例如Base()Derive())?

  • virtual功能?我会把它放在哪里?在派生或基地?或两者兼而有之?

  • 公共变量? (可怕!)

我在其他头文件上看到,他们会在其中添加extern。我需要它吗?

这将破坏我的所有代码语法

请回答......

1 个答案:

答案 0 :(得分:3)

听起来好像是在链接应该在dll中的库文件中。所以你根本就没有使用dll。一切都进入了exe文件。

Microsoft需要exe中的__declspec(dllexport)__declspec(dllimport}。它变得复杂,因此有一些宏可以对其进行排序。

CLASS_DECLSPEC

然后,编译器会排出要使用的__declspec中的哪一个。

请参阅:http://msdn.microsoft.com/en-us/library/8fskxacy(v=vs.80).aspx