我尝试使用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文件中看到函数?
答案 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
符号中。