从 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
在你的静态库上,那将报告所有
静态库中所有目标文件中的符号,并将它们分类
作为 External
或 Static
。您已限定为 __declspec(dllexport)
的符号
将出现在列出的 External
个符号中。
我尝试使用 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
在你的静态库上,那将报告所有
静态库中所有目标文件中的符号,并将它们分类
作为 External
或 Static
。您已限定为 __declspec(dllexport)
的符号
将出现在列出的 External
个符号中。