从 Win32 交叉构建的静态库中导出函数

Exporting Functions from a Win32 Cross Built Static Library

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

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

$(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。用 nm 在 linux 端检查这个我可以看到所有组成的目标文件和它们包含的函数

当我在 windows 10 VM 上检查 mylib.lib 时没有,即

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

None 个函数正在导出。

在相关的头文件中我用__declspec(dllexport)

标记了我想要导出的函数

这在我生成 .dll 时工作正常,即我标记为导出的函数是唯一在 .dll 文件中可见的函数

但是对于等效的静态库,什么都没有导出?

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

dumpbin /exports 列出由 executable 或 DLL 导出的符号。参见 the DUMPBIN options documentation

静态库不是 executable 或 DLL。它只是一袋目标文件 Unix ar 存档格式(与 MS LIB 格式相同)。

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

dumpbin /option... static.lib

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

dumpbin /exports file.obj

永远不会在目标文件中报告任何导出 file.obj 因为一个对象 文件也不是 executable 或 DLL。它没有动态符号 stable。 只有 executable 或 DLL 可以公开动态链接的符号:它随附提供 它的动态符号 table 当它由 linker 生成时,它没有 hand 在生成目标文件或静态库时。

如果您现在构建一个 executable 或 DLL 链接静态库中的任何函数 您已在库的头文件中使用 __declspec(dllexport) 进行限定, 然后链接器将该函数添加到输出的动态符号table executable 或 DLL,然后如果您在该 executable 上 dumpbin /exports 或 DLL,你会看到函数报错了

目标文件可以定义全局符号。全局符号(a.k.a public/external 符号)可能是也可能不是 动态联动导出,看是否合格__declspec(dllexport) 或不。符号必须是全局的才能导出 DLL。

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