是否有可能识别与某些头文件对应的库
Is it possible to identify the library that correspond to certain header files?
假设在同一目录中有多个头文件和库文件。如果我不知道我应该链接到哪个库,我可以通过编程确定必须使用哪个库吗?
假设我试图编译我的代码,并且链接器抱怨无法解决的外部符号,我能做些什么,知道正确的库存在于同一目录中吗?
我认为这个问题的答案可能对你有很大帮助:检查.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、非全局函数(即不需要包含在头文件中的函数)也会输出。
- 是否有可能使用debug_info获取ELF文件的源代码?
- 我的C++文件中是否有可能的内存泄漏
- 是否有可能通过使用openMP在fstream(文件读取)上获得一些性能提升
- 是否有可能改变.so文件代码在android工作室本身,并使构建
- 是否有可能调试最初由可执行文件生成的已删除符号的核心文件?
- 是否有可能在一个Ragel文件中调用多台机器?
- 是否有可能在Makefile的单次传递中使用gcc/g++/nvcc自动依赖-M而不将依赖保存到文件中?
- 是否有可能从c++中的.exe文件中抓取数据?
- 是否有可能在Android中通过编译二进制文件生成本地缓冲区溢出来获得根访问权限?
- 有可能用c++从二进制文件中读出位到位吗?
- 是否有可能在实现文件中使用名称空间或等价物来避免必须在每个函数前加上类名
- 是否有可能使用log4cXX为每一天创建一个新文件
- sqlite C c++库保持DB文件作为内存映射文件吗?是否有可能做到这一点
- 是否有可能为c++构建Eigen库而不是使用预构建的文件?
- 是否有可能在头文件中初始化带有在构造函数中初始化的成员的私有数组?c++
- C++,Visual Studio:有可能创建一个可执行文件来设置环境变量,然后执行吗
- 应用程序是否有可能丢失与文件的 I/O 连接
- 解析配置或 XML 文件有哪些可能的例外
- 是否有可能使用各种编译器应用程序访问iOS上的文件?
- 是否有可能识别与某些头文件对应的库