2

所以我试图将一个使用另一个 dll 中的类的类导出到 dll 中。一个例子将更好地解释这种情况。

//aclass.h
class  __declspec(dllexport) aclass{
    public:
        void amethod();
};

_

//aclass.cpp
#include "aclass.h"

void aclass::amethod(){
    std::cout<<"a method"<<std::endl;
}

因此,在不包含任何外部内容的情况下,它会编译(aclass.dll)并从其他项目运行,例如。

#include <aclass.h>

void main(){
    aclass a;
    a.amethod();

    _getch();
}

当我包含一个外部头文件(带有一个 dll 和一个 lib 文件,其路径被传递给编译器)时,就会出现问题。一旦我包含外部标题:

//aclass.h
#include <externalapi.h>
class  __declspec(dllexport) aclass{
    public
    void amethod();
};

甚至没有从 externalapi 调用任何函数类,当尝试编译时我得到:

Error 1 error LNK2001: unresolved external symbol __imp__Math_e C:\...\aclass.obj  aclass
Error 1 error LNK2001: unresolved external symbol __imp__Math_pi C:\...\aclass.obj aclass
Error 1 error LNK2001: unresolved external symbol __imp__Math_zero C:\...\aclass.obj aclass
....etc

最初(没有 __declspec(dllexport) 指令)我会通过以下方式访问这些:

Math::pi;
Math::e;
etc.

因为它们是 externalapi 的静态常量。根据我对 dll 导出的整个工作原理的了解,这就是所谓的名称修饰(?)。所以两个问题:

  1. 我应该在语法中进行哪些更改,以便外部库的函数名称与其原始 c++ 名称一起“加载”?这必须以某种方式成为可能。到目前为止,我正在开发我的代码,作为一个独立的应用程序,这意味着我没有使用 __declspec(dllexport) 关键字,我包含相同的头文件,使用完全相同的 dll 和 lib 文件,一切都在编译和运行平稳。显然,上面的代码是对我的实际代码的过度简化,以指出问题所在。
  2. 在我发现的大多数“导出到 dll”方法中,人们使用 __declspec(dllexport) 和 __declspec(dllimport)。我理解 __declspec(dllexport) 或多或少告诉编译器将部分代码导出到 dll,这是有道理的。__declspec(dllimport) 到底是什么意思。例如,为什么我在开始时编写的第一段代码无需 __declspec(dllimport) 就可以作为 dll 进行编译和使用?

谢谢你的时间!

4

2 回答 2

2

__declspec(dllimport)告诉编译器该函数将使用导入 LIB 从 DLL 导入,而不是在不同的 OBJ 文件或静态 LIB 中找到。

顺便说一句:听起来您可能根本不需要 DLL。DLL 专门用于在编译后换出库而无需重新编译应用程序,或在应用程序之间共享大量目标代码。如果您只想在不同项目之间重用一组代码,而不必为每个项目编译,那么静态库就足够了,而且更容易推理。

于 2013-07-25T13:41:19.800 回答
1

通常最好有一个条件宏来导入或导出,具体取决于

#ifdef MODULE1
#define MODULE1_DECL __declspec(dllexport)
#else
#define MODULE1_DECL __declspec(dllimport)
#endif

这样,您可以导出要导出的功能等,并导入要使用的功能。例如,在您的项目中查看此 SO帖子
You #define MODULE1(may as a setting) 将导出定义,并使用MODULE1_DECL定义而不是显式地将其中一个__declspec(dllimport)__declspec(dllexport)放在您的代码中。阅读手册了解更多详情。
名称修改只发生在 C++ 中:它表示命名空间,函数重载等参数用于消除歧义。

于 2013-07-25T11:55:46.957 回答