gpt4 book ai didi

dllexport - 将 C++ 类导出到 DLL,包括外部 DLL

转载 作者:行者123 更新时间:2023-12-04 04:48:12 24 4
gpt4 key购买 nike

所以我试图将一个使用另一个 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 导出的整个过程的理解,这就是所谓的名称修改(?)。所以两个问题:
  • 我应该在语法中进行哪些更改,以便使用其原始 C++ 名称“加载”外部库的函数名称?这必须以某种方式可能。到目前为止,我一直在开发我的代码,作为一个独立的应用程序,这意味着我没有使用 __declspec(dllexport) 关键字,我包含了相同的头文件,使用了完全相同的 dll 和 lib 文件,并且一切都在编译和运行平稳。显然,上面的代码是对我的实际代码的过度简化,以指出问题所在。
  • 在我发现的大多数“导出到 dll”方法中,人们使用 __declspec(dllexport) 和 __declspec(dllimport)。我理解 __declspec(dllexport) 或多或少告诉编译器将代码的一部分导出到 dll,这是有道理的。 __declspec(dllimport) 的确切含义是什么。例如,为什么我一开始写的第一段代码可以编译并用作 dll 而不需要 __declspec(dllimport)?

  • 感谢您的时间!

    最佳答案

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

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

    关于dllexport - 将 C++ 类导出到 DLL,包括外部 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17853382/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com