gpt4 book ai didi

c++ - 共享库和 .h 文件

转载 作者:IT老高 更新时间:2023-10-28 21:34:52 26 4
gpt4 key购买 nike

我对程序如何使用共享库有些疑问。

当我构建一个共享库(使用 -shared -fPIC 开关)时,我会从外部程序中提供一些功能。通常我会做一个 dlopen() 来加载库,然后 dlsym() 将上述函数链接到一些函数指针。此方法不涉及包含任何 .h 文件。有没有办法避免执行 dlopen() 和 dlsym() 并且只包含共享库的 .h?

这可能是 c++ 程序使用存储在系统共享库中的代码的方式。即只包括 stdlib.h 等。

最佳答案

尼克,我认为所有其他答案实际上都是在回答您的问题,即您如何链接库,但是您提出问题的方式表明您对头文件和库之间的区别存在误解。他们不一样。你需要两者,而他们做的不是同一件事。

构建可执行文件有两个主要阶段,编译(将您的源代码转换为中间形式,包含可执行的二进制指令,但不是可运行的程序)和链接(将这些中间文件组合成单个运行的可执行文件或库)。

当你这样做 gcc -c program.c ,您正在编译,并生成 program.o .这一步是 headers 重要的地方。您需要 #include <stdlib.h>program.c (例如)使用 mallocfree . (同样,#include <dlfcn.h>dlopen 需要 dlsym 。)如果你不这样做,编译器会提示它不知道这些名称是什么,并因错误而停止。但是如果你这样做 #include编译器的头文件将您调用的函数的代码插入program.o .它只是向它们插入一个引用。原因是为了避免重复代码:程序的每个部分只需要访问一次代码,因此如果您需要更多文件(module1.cmodule2.c 等),即使它们 < em>全部使用malloc您最终只会得到许多对 malloc 的单个拷贝的引用。 .该单一拷贝以共享或静态形式( libc.solibc.a )存在于标准 library 中,但您的源代码中没有引用这些拷贝,编译器也不知道它们。

链接器。在链接阶段你做gcc -o program program.o .然后,链接器将搜索您在命令行中传递给它的所有库,并找到您调用的所有未在您自己的代码中定义的函数的single 定义。这就是 -l确实(正如其他人所解释的那样):告诉链接器您需要使用的库列表。它们的名称通常与您在上一步中使用的标题无关。例如使用 dlsym你需要libdl.solibdl.a , 所以你的命令行是 gcc -o program program.o -ldl .使用 mallocstd*.h 中的大部分功能您需要的 header libc ,但由于 每个 C 程序都使用该库,它是自动 链接的(就像您已经完成了 -lc 一样)。

抱歉,如果我要详细介绍,但如果您不知道其中的区别,您会想要了解。如果不这样做,就很难理解 C 编译的工作原理。

最后一件事:dlopendlsym不是正常的链接方法。它们用于特殊情况,您希望根据信息动态确定您想要的行为,无论出于何种原因,这些信息仅在运行时可用。如果您知道要在编译时调用哪些函数(99% 的情况下是这样),则不需要使用 dl*功能。

关于c++ - 共享库和 .h 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176427/

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