gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:32 25 4
gpt4 key购买 nike

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

当我在 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 文件中可见?

最佳答案

dumpbin/exports 列出可执行文件或 DLL 导出的符号。参见 the DUMPBIN options documentation

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

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

dumpbin /option... static.lib

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

dumpbin /exports file.obj

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

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

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

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

关于c - 从 Win32 交叉构建的静态库中导出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com