是否有可能识别与某些头文件对应的库

Is it possible to identify the library that correspond to certain header files?

本文关键字:文件 有可能 识别 是否      更新时间:2023-10-16

假设在同一目录中有多个头文件和库文件。如果我不知道我应该链接到哪个库,我可以通过编程确定必须使用哪个库吗?

假设我试图编译我的代码,并且链接器抱怨无法解决的外部符号,我能做些什么,知道正确的库存在于同一目录中吗?

我认为这个问题的答案可能对你有很大帮助:检查.lib文件的工具?

您可以编写一个简单的脚本,循环遍历目录中的所有lib文件,并调用dumpbin将所有lib的符号转储到以lib名称开头的文件中,以便稍后您可以在生成的文件中搜索所需的符号以获得正确的lib。

"我可以通过编程确定必须使用哪个库吗? "

不在同一个程序/代码库中。"程序化"(比如template技巧等)能力一直保留到编译阶段。一旦链接开始(从今天开始),控件就消失了。

"知道正确的库存在于同一目录中,我能做些什么吗?"

再次没有。我不想让你失去动力,但你所要求的无论如何都不会有帮助。假设,您设法找到了一种方法来知道库是否存在于同一目录中。它的目的是什么?因为实际上库可以驻留在任何路径中。只需在gcc的MSVC或-L选项中设置路径变量。因此,将库放在同一目录下的问题是没有意义的。

你可能想问,如何知道库是否存在于你的系统&在那里。
当然,这在相同的代码库中是不可能实现的。因为你必须运行那个代码库来发现这个库是否存在于你的系统中。要运行那个代码库,你必须链接它。先有鸡的问题。
您可以手动检查或编写自己的单独脚本/代码来完成此任务。

也许使用dll更好c++中的GetProcAddress函数或者如果你自己写lib,你可以在header中添加这样的代码:'#'pragma注释(lib, "libname. lib ")自由")希望能有所帮助

我最近一直在学习更多的c++,我有一个类似的问题。大多数库和头文件似乎至少共享一个相似的名称,但是"libm"answers"math.h"之间的差异真的让我想知道如何更系统地确定这一点。

对于静态和动态库,我发现readelf工具很有用,我喜欢的命令是:

readelf --symbols <elf_file> | sed -ne '/FUNC/p'

对于我的激励例子:

$ readelf --symbols /lib/libm.so.5 | sed -ne '/FUNC/p'
     2: 0000000000000000   476 FUNC    WEAK   DEFAULT  UND __cxa_finalize@FBSD_1.0 (8)
     4: 0000000000000000    62 FUNC    GLOBAL DEFAULT  UND __isinf@FBSD_1.0 (8)
     5: 0000000000000000   310 FUNC    GLOBAL DEFAULT  UND ldexp@FBSD_1.0 (8)
     6: 0000000000000000    41 FUNC    GLOBAL DEFAULT  UND __isinff@FBSD_1.0 (8)
     9: 0000000000000000     8 FUNC    GLOBAL DEFAULT  UND __tls_get_addr@FBSD_1.0 (8)
    11: 0000000000000000    16 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail@FBSD_1.0 (8)
    12: 0000000000000000    53 FUNC    GLOBAL DEFAULT  UND __isinfl@FBSD_1.0 (8)
    14: 0000000000000000    84 FUNC    GLOBAL DEFAULT  UND memset@FBSD_1.0 (8)
    16: 0000000000004ed0     6 FUNC    GLOBAL DEFAULT   12 lrintf@@FBSD_1.0
    17: 0000000000019930   405 FUNC    GLOBAL DEFAULT   12 log10l@@FBSD_1.3
    18: 0000000000016590   600 FUNC    GLOBAL DEFAULT   12 floorl@@FBSD_1.0
  ...

此命令也适用于ar归档文件,如libcurl.a.

在这里你可以看到在库中定义的函数。从那里,我直观地比较了最后一列中的名称(如"log10l")与头文件/usr/include/math.h中的名称,发现了高度的对应关系。在此基础上编写程序对我来说似乎是可行的。解析上面readelf命令的最后一列,并对/usr/include中的所有.h文件执行grep。不过,我并没有走到那一步。

在做了一些与我的答案相关的实验之后,我发现sed命令可能也可以根据您的需求进行更多的改进。当我在libcurl上使用readelf时。A、非全局函数(即不需要包含在头文件中的函数)也会输出。

相关文章: