首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++:如何在dll中声明但不定义extern函数

C++:如何在dll中声明但不定义extern函数
EN

Stack Overflow用户
提问于 2020-10-14 19:28:01
回答 1查看 182关注 0票数 0

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

代码语言:javascript
运行
复制
//To be defined by user
Application* CreateApplication();

当将代码编译到Linux上的共享库中时,这是非常完美的。库的任何用户都可以为声明的函数定义一个实现,并且它可以在库中使用。如果库的用户忘记定义实现,他们将得到一个指出这一点的错误。

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

代码语言:javascript
运行
复制
unresolved external symbol Application* __cdecl CreateApplication(void)

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

为什么我不能在这样的dll中声明(但不定义)一个函数?我应该如何修复我的代码,以便它既可以在Linux上运行,也可以在Windows上运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-14 20:14:08

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

标题:

代码语言:javascript
运行
复制
#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:

代码语言:javascript
运行
复制
#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)
    {
        ...
    }
}

主管:

代码语言:javascript
运行
复制
#include "MyLib.h"

Application MyCreateApplicationFunc()
{
    ...
}

// during startup, call this...
SetCreateApplicationFunc(&MyCreateApplicationFunc);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64360280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档