如何探索.A库文件中的函数

时间:2015-04-24 20:59:12

标签: c++ windows dll mingw

我从mingw创建了一个.A和一个相应的.dll文件。这将在Windows上运行。现在我尝试从不同的组件接口和使用.A库中的函数,我收到链接器错误。我想确保我的功能是否正确导出。因此,我按照this链接决定这样做

> lib.exe /list libSomeLibrary.a

因此我得到了类似的东西

d001861.o
d001862.o
d001863.o
d001864.o
d001865.o
d001866.o
d001867.o
d001868.o
d001869.o
d001870.o
d001871.o
d001872.o
d001873.o
d001874.o
d001875.o
d001876.o
d001877.o
d001878.o
d001879.o
d001880.o
d001881.o
d001882.o
d001883.o
....
....

这是对的吗?有没有办法让我真正获得lib文件中的函数名称。

2 个答案:

答案 0 :(得分:1)

由于您使用的是MinGW,因此可以使用nm命令列出任何libfoo.a存档文件的内容;因此使用:

nm -A libfoo.a | more

(或者更好的是,如果你有less命令,例如在MinGW的MSYS shell环境中):

nm -A libfoo.a | less

它将列出归档中指定的所有符号,按照提供每个符号的嵌入式目标文件的名称进行分组和限定。

答案 1 :(得分:0)

.a库文件包含许多单独的目标文件,这些文件组合在一起成为库存档。它是实际包含符号和代码的单个.o目标文件。

您应该能够使用dumpbin工具检查Windows系统上的库。 /exports选项应显示导出的符号。我对此工具没有任何经验,但上面的页面暗示它应该能够直接在windows lib文件上运行。

您声明您正在使用GNU Binutils附带的MingW,包括nmobjdump,两者都可用于检查目标文件。要使用这些工具,您可能会发现从.a文件中提取.o文件更方便,您可以使用ar命令执行此操作。如果不这样做,它将列出归档中所有目标文件中的所有信息。

示例(在Linux系统上显示,但如果使用MingW,这些工具在Windows中的工作方式相同):

从libbfd.a中提取corefile.o

$ ar x /usr/lib64/libbfd.a corefile.o

检查corefile.o中的全局(外部)符号

$ nm -g corefile.o 
0000000000000000 T bfd_core_file_failing_command
0000000000000030 T bfd_core_file_failing_signal
0000000000000060 T bfd_core_file_pid
                 U bfd_set_error
0000000000000090 T core_file_matches_executable_p
                 U filename_cmp
00000000000000d0 T generic_core_file_matches_executable_p
                 U _GLOBAL_OFFSET_TABLE_
                 U strrchr