gpt4 book ai didi

c++ - 如何使用模块在 C 中编译应用程序?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:46 24 4
gpt4 key购买 nike

我想做一个应用程序,它可以用外部模块编译,例如在 php 中。在php中你可以在运行时加载模块,或者将php与模块一起编译,这样模块就可以在运行时不加载。但我不明白如何做到这一点。如果我在 module.c 中有模块并且有一个函数,称为 say_hello,如果你明白我的意思,我如何将它注册到主应用程序?

/* module.c */
#include <stdio.h>

// here register say_hello function, but how, if i can't in global scope
// call another function?

void say_hello()
{
printf("hello!");
}

如果我将所有文件(主应用程序 + 模块)编译在一起,则主应用程序不会引用 say_hello 函数,因为只有用户在其代码中调用它时才会调用它。那么我怎么能对我的应用说,嘿,有 say_hello 函数,如果有人想调用它,你知道它存在。

EDIT1:我需要在运行时有类似表的东西,我可以在其中查看用户调用的函数是否存在(具有 C 等价物)。头文件对我没有帮助。

EDIT2:我的应用程序是为我的脚本语言解释的。

EDIT3:如果有人在 php 中调用函数,php 解释必须知道该函数存在。我知道动态链接,如果加载了 .so 或 .dll,则会调用一些启动例程,您可以在该 dll 中简单地注册函数,因此 php 解释可以看到是否注册了某个模块,例如名为“say_hello”的函数。但是,如果我想编译带有 gd 支持的 php,那么如何将 gd 函数注册到某些 php 函数列表、哈希表或其他什么?

最佳答案

我想您正在寻找的是动态库(我们通常将运行时可加载模块称为 C 和操作系统世界中的动态/共享库)。以 Pidgin 为例它支持插件来扩展它的功能。它为插件制造商提供了一个特定的接口(interface)来遵守,比如注册、加载、卸载和使用的功能,插件必须遵循这些接口(interface)。

当程序加载时,它会在其 plugins 目录中查找此类动态库,如果存在,它将加载并使用它,否则它将跳过公开功能。需要接口(interface)的原因是因为不同的模块可以有不同的功能,这些功能在运行时是未知的,一个应用程序。必须有一个共同的、商定的方式来“对话”它的插件/模块。

每个 C 程序都可以链接到静态或动态库; static 会将库中的代码复制到所述程序中,这样就不会为程序运行留下任何依赖关系,而链接到动态库则期望动态库在程序启动时存在。第三种方法是不链接到 DLL,而只是要求操作系统执行库的加载操作。如果成功,则使用动态模块,否则忽略。仅当加载调用成功时,动态库应执行的功能才会向用户公开。

需要注意的是,这是操作系统提供的特性,与使用的语言无关(C或C++或Python在这里无关紧要);就 C 而言,编译器仍然链接到已知代码,即在编译时可用的代码。这就是不同操作系统的原因,需要编写不同的代码来加载动态模块。更重要的是,syuch 库的文件类型/格式因系统而异。在 Linux 中称为共享对象 (.so),在 Mac 中称为动态库 (.dylib),在 Windows 中称为动态链接库 (.dll)。

关于c++ - 如何使用模块在 C 中编译应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041831/

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