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);
我有一个编译成库的项目,并声明了某个函数要由库的用户实现:
//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);