1

我尝试使用i686-w64-mingw32交叉构建工具链构建一个 win32 静态库。

mylib.lib我通过 Makefile构建了目标文件和文件:

$(program_RELEASE_NAME_WIN_STATIC): $(RELEASE_OBJS_WIN32_STATIC)
    i686-w64-mingw32-gcc-ar rcs $(BUILD_DIR_WIN32)/static/$@ $^

$(BUILD_DIR_WIN32)/static/%.o: %.c $(HEADERS)
    $(RELEASE_LINK_WIN32.c) $< -c -o $@

这给了我静态库mylib.lib。在 linux 端检查这个,nm我可以看到所有的组成目标文件和它们包含的函数

不,当我mylib.lib在 Windows 10 VM 上检查时,即

DUMPBIN /EXPORTS mylib.lib

我得到:

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file mylib.lib

File Type: LIBRARY

  Summary

           C .bss
           C .data
         6AC .drectve
        5EAC .rdata
         444 .rdata$zzz
       29900 .text
          38 .text.unlikely

没有任何功能被导出。

在相关的头文件中,我标记了要导出的函数__declspec(dllexport)

这在我生成 .dll 时效果很好,即我标记为导出的函数是 .dll 文件中唯一可见的函数

但是对于静态库等价物,什么都没有被导出?

您如何使函数在 win32 .lib 文件中可见?

4

1 回答 1

1

dumpbin /exports列出可执行文件或 DLL 导出的符号。请参阅DUMPBIN 选项文档

静态库不是可执行文件或 DLL。它只是一袋 Unixar归档格式(与 MSLIB格式相同)的目标文件。

dumpbin分析 COFF 二进制文件。当你运行时:

dumpbin /option... static.lib

static.lib它根据.分析每个目标文件/option...。但:

dumpbin /exports file.obj

永远不会报告目标文件中的任何导出,file.obj因为目标文件也不是可执行文件或 DLL。它没有动态符号稳定。只有可执行文件或 DLL 可以公开动态链接的符号:它在由链接器生成时提供其动态符号表,链接器不参与生成目标文件或静态库。

如果您现在构建一个可执行文件或 DLL,该可执行文件或 DLL 链接您__declspec(dllexport)在库的头文件中已限定的静态库中的任何函数,那么链接器将该函数添加到输出可执行文件或 DLL 的动态符号表中,如果您然后dumpbin /exports在该可执行文件或 DLL 上,您将看到报告了该函数。

目标文件可以定义全局符号。全局符号(又名公共/外部符号)可能会或可能不会导出用于动态链接,这取决于它是否合格__declspec(dllexport) 。符号必须是全局的才能成为 DLL 导出。

如果您dumpbin /symbols在静态库上运行,则会报告静态库中所有目标文件中的所有符号,并将它们分类为ExternalStatic。您已限定为的符号__declspec(dllexport) 将出现在External列出的符号中。

于 2017-12-14T20:35:07.943 回答