C++ Visual Studio Windows: 如何在 dll 中声明但不定义外部函数

C++ Visual Studio Windows: how to declare but not define extern function in dll

我有一个编译成库的项目,并声明了某个函数要由库的用户实现:

//To be defined by user
Application* CreateApplication();

将代码编译到 Linux 上的共享库时,效果很好。该库的任何用户都可以为声明的函数定义一个实现,并且它可以在库内使用。如果库的用户忘记定义一个实现,他们会得到一个错误提示。

我现在正在将库移植到 Windows,它应该被编译成一个 dll。但是,我 运行 遇到了问题,因为 Visual Studio 使用的链接器正在抱怨:

unresolved external symbol Application* __cdecl CreateApplication(void)

我尝试添加 extern 关键字以指示函数的定义在其他地方,但这没有用。

为什么我不能像这样在 dll 中声明(但不能定义)函数?我应该如何修复我的代码,使其在 Linux 和 Windows 上都能正常工作?

你试图做的事情只能在静态库中工作,它不能在像 DLL 这样的动态库中工作。为此,您必须更改代码以改为使用函数指针。使用 DLL 的应用程序可以从自己的代码中传入所需函数的地址,然后 DLL 可以将该地址分配给它根据需要使用的变量,例如:

HEADER:

#ifndef MYLIB_H
#ifndef MYLIB_H

#ifdef COMPILING_MY_LIB
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif

// declare Application as needed...

typedef Application (*lpCreateApplicationFunc)();

#ifdef __cplusplus
extern "C" {
#endif

MY_EXPORT void SetCreateApplicationFunc(lpCreateApplicationFunc func);

#ifdef __cplusplus
}
#endif

#endif

DLL:

#define COMPILING_MY_LIB
#include "MyLib.h"

//To be defined by user
lpCreateApplicationFunc CreateApplication = NULL;

void SetCreateApplicationFunc(lpCreateApplicationFunc func)
{
    CreateApplication = func;
}

void doSomething()
{
    Application *app = NULL;

    if (CreateApplication)
        app = (*CreateApplication)();

    if (app)
    {
        ...
    }
}

执行文件:

#include "MyLib.h"

Application MyCreateApplicationFunc()
{
    ...
}

// during startup, call this...
SetCreateApplicationFunc(&MyCreateApplicationFunc);