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

时间:2017-12-14 16:07:11

标签: c static-libraries static-linking cross-build

我尝试使用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

没有导出任何功能。

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

标记要导出的功能

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

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

你打算如何在win32 .lib文件中看到函数?

1 个答案:

答案 0 :(得分:1)

def default_item "yeah" end def default_other "other" end def thing(item: default_item(), other: default_other()) puts item + " " + other end def thing1(other: default_other()) thing(other: other) end def thing2(item: default_item()) thing(item: item) end thing1() thing2() thing1(other:"Is Other") thing2(item:"Is Item") # fail with argument exception # thing1(item:"Not Item") # thing2(other:"Not Other") 列出可执行文件或DLL导出的符号。见the DUMPBIN options documentation

静态库不是可执行文件或DLL。它只是一包目标文件 以Unix item: default_item()存档格式(与MS dumpbin /exports格式相同)。

ar分析COFF二进制文件。当你跑:

LIB

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

static.lib

永远不会在对象文件/option...中报告任何导出,因为它是一个对象 文件不是可执行文件或DLL。它没有动态符号稳定。 只有可执行文件或DLL才能公开动态链接的符号:它随附 它由链接器生成的动态符号表,没有任何关联 在生成目标文件或静态库。

如果您现在构建一个可执行文件或DLL,它链接静态库中的任何函数 您已在图书馆的头文件中使用dumpbin /exports file.obj 限定, 然后链接器将该函数添加到输出的动态符号表中 可执行文件或DLL,如果您然后file.obj在该可执行文件或 DLL,您将看到该函数已报告。

目标文件可以定义全局符号。全局符号(a.k.a公共/外部符号)可能是也可能不是 导出以进行动态链接,具体取决于它是否合格__declspec(dllexport) 或不。符号必须是全局的才能成为DLL导出。

如果您在静态库上运行dumpbin /exports,则会报告所有内容 静态库中所有目标文件中的符号,并对它们进行分类 为__declspec(dllexport)dumpbin /symbols。您符合External条件的符号 将出现在列出的Static符号中。