gpt4 book ai didi

c++ - 延迟加载 DLL

转载 作者:太空狗 更新时间:2023-10-29 21:26:16 25 4
gpt4 key购买 nike

为简单起见,我将带有 header MathFuncsDll.h 的 DLL_TUTORIAL.dll 放在根文件夹 C:\中。

然后,创建空项目,设置

Configuration Properties->Linker->Input->Delay Loaded Dll's

C:\DLL_TUTORIAL.dll;%(DelayLoadDLLs)

Configuration Properties->VC++ Directories->Include Directories

C:\;$(IncludePath)

编译器命令:

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "_MBCS" /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\clean_rough_draft.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue

这个项目只包含带有 main 的文件。

主要.cpp

#include <Windows.h>
#include <iostream>
#include "MathFuncsDll.h"

using namespace MathFuncs;
using namespace std;

int main()
{
std::cout<< MyMathFuncs<int>::Add(5,10)<<endl;

system("Pause");
return 0;
}

Dll 已在不同的解决方案中成功编译。

MathFuncsDll.h

namespace MathFuncs
{
template <typename Type>
class MyMathFuncs
{
public:
static __declspec(dllexport) Type Add(Type a, Type b);

static __declspec(dllexport) Type Subtract(Type a, Type b);

static __declspec(dllexport) Type Multiply(Type a, Type b);

static __declspec(dllexport) Type Divide(Type a, Type b);

};


}

这些函数的定义:

#include "MathFuncsDll.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
template <typename Type>
Type MyMathFuncs<Type>::Add(Type a,Type b)
{ return a+b; }

template <typename Type>
Type MyMathFuncs<Type>::Subtract(Type a,Type b)
{ return a-b; }

template <typename Type>
Type MyMathFuncs<Type>::Multiply(Type a,Type b)
{ return a*b; }

template <typename Type>
Type MyMathFuncs<Type>::Divide(Type a,Type b)
{
if(b == 0) throw new invalid_argument("Denominator cannot be zero!");
return a/b;
}
}

运行这个程序失败:

1>main.obj : error LNK2001: unresolved external symbol "public: static int __cdecl MathFuncs::MyMathFuncs::Add(int,int)" (?Add@?$MyMathFuncs@H@MathFuncs@@SAHHH@Z) 1>C:\Users\Tomek\Documents\Visual Studio 2010\Projects\clean_rough_draft\Release\clean_rough_draft.exe : fatal error LNK1120: 1 unresolved externals

你能指出我的错误吗?

最佳答案

这个问题与是否延迟加载DLL无关。我可以在这里看到两个问题:

  1. 您正在导出模板化函数。这不会那样工作,因为 Visual C++ 编译器不支持模板导出,但是已经从标准中删除了。为此,您有两种可能的解决方案:

    • 将方法的实现移动到 .h 文件中,因此不再需要 DLL,因为所有代码都在头文件中;
    • 使用您将在客户端应用程序中使用的类型实例化模板。这是通过在您的 cpp 文件中放置具有确切类型的实例化代码,在 header 中做一些 extern template 声明等来完成的。您可以在 Google 中查找更多信息,只需搜索“extern template” DLL' 或类似的东西。
  2. 您只在创建 DLL 时导出方法,但从不导入它们(或者至少我从代码中看到的是这样)。在每个方法前面使用 __declspec(dllexport),它告诉编译器将这些方法放入 DLL 中。当您想要从客户端应用程序使用这些方法时,您必须从 DLL 中导入它们。这是通过在每个方法前面放置 __declspec(dllimport) 来完成的。由于您不能将两个前缀都放在方法上,因此您必须创建两个几乎相同的头文件,它们只是在该方法前缀上有所不同,或者根据这是 DLL 构建代码还是客户端应用程序使用一些宏替换。再一次,您可以在 Google 中查找它,看看它是如何完成的。

希望对您有所帮助。

关于c++ - 延迟加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064910/

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