gpt4 book ai didi

c++ - 仅使用 DLL *.h 头文件构建(编译链接)应用程序代码并在运行时加载 DLL 实现(显式链接)

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:26 25 4
gpt4 key购买 nike

我有一个应用程序代码调用带有显式链接(或运行时链接)的 DLL 库以访问导出的类。

动态链接库

#ifdef DLL_EXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

FooDLL.h

#include "DLL.h"

class DLL_API Foo
{
public:
void doSomeThing();
};

extern "C" DLL_API Foo* _getInstance() {
return new Foo();
}

typedef Foo* (*getInstanceFactory)();

Foo* getInstance() {
HINSTANCE dllHandle = LoadLibraryA("Foo.dll");
getInstanceFactory factory_func = (getInstanceFactory)GetProcAddress(dllHandle, "_getInstance");
return factory_func();
}

FooDLL.cpp

#include "FooDLL.h"

Foo::doSomething() {
// .......
}

Application.cpp(调用 DLL)

#include "FooDLL.h"

Foo* obj = getInstance();
obj->doSomething(); // XXX this line can be compiled and linked only when DLL is already in path

只有当 DLL 文件包含在 lib 路径中时,才能构建(例如编译和链接)以上代码。否则我会得到 Unresolved external symbol 错误

error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall Foo::doSomething()" .....

是否可以在构建期间仅使用 DLL 头文件(即 FooDLL.h)而不使用 DLL/LIB 文件来构建应用程序代码? (p.s. 类实现必须在cpp文件中。)

谢谢!

最佳答案

有虚函数。

class Foo
{
public:
void virtual doSomeThing();
};

关于c++ - 仅使用 DLL *.h 头文件构建(编译链接)应用程序代码并在运行时加载 DLL 实现(显式链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801812/

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