我有一个被编译成库的项目,并声明了一个由库的用户实现的特定函数:
//To be defined by user
Application* CreateApplication();当将代码编译到Linux上的共享库中时,这是非常完美的。库的任何用户都可以为声明的函数定义一个实现,并且它可以在库中使用。如果库的用户忘记定义实现,他们将得到一个指出这一点的错误。
我现在正在将库移植到Windows,在Windows中它应该被编译成一个dll。但是,由于Visual使用的链接器正在抱怨,我遇到了一些问题:
unresolved external symbol Application* __cdecl CreateApplication(void)我尝试添加extern关键字,以指示函数的定义在其他地方,但这不起作用。
为什么我不能在这样的dll中声明(但不定义)一个函数?我应该如何修复我的代码,以便它既可以在Linux上运行,也可以在Windows上运行?
发布于 2020-10-14 20:14:08
您试图做的工作只在静态库中工作,它不能在动态库(如DLL )中工作。为此,您必须更改代码以使用函数指针。使用DLL的应用程序可以从自己的代码中传入所需函数的地址,然后DLL可以将该地址分配给它根据需要使用的变量,例如:
标题:
#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
#endifDLL:
#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);https://stackoverflow.com/questions/64360280
复制相似问题