C 从Win32交叉构建的静态库导出函数
我尝试使用跨构建工具链C 从Win32交叉构建的静态库导出函数,c,static-libraries,static-linking,cross-build,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)
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 $@
我得到:
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
没有导出任何函数
在相关的头文件中,我用\uu declspec(dllexport)
这在我生成.dll时运行良好,也就是说,我标记为导出的函数是.dll文件中唯一可见的函数
但是对于静态库,没有导出任何内容
如何使函数在win32.lib文件中可见?
dumpbin/exports
列出了可执行文件或DLL导出的符号。看
静态库不是可执行文件或DLL。这只是一包目标文件
在Unixar
archive格式中(与MSLIB
格式相同)
dumpbin
分析COFF二进制文件。运行时:
dumpbin /option... static.lib
它根据/option…
分析static.lib中的每个对象文件。
但是:
不会在对象文件file.obj
中报告任何导出,因为对象
文件也不是可执行文件或DLL。它没有稳定的动态符号。
只有可执行文件或DLL可以公开动态链接的符号:随附
它的动态符号表是由链接器生成的,链接器没有指针
在生成对象文件或静态库时
如果您现在构建一个可执行文件或DLL来链接静态库中的任何函数
您已通过库头文件中的\uu declspec(dllexport)
获得资格,
然后链接器将该函数添加到输出的动态符号表中
可执行文件或DLL,如果您随后dumpbin/exports
,则
DLL,您将看到该函数已报告
对象文件可以定义全局符号。全局符号(也称为公共/外部符号)可以是,也可以不是
导出用于动态链接,具体取决于它是否合格\uu declspec(dllexport)
或者不是。符号必须是全局的才能作为DLL导出
如果在静态库上运行dumpbin/symbols
,将报告所有
静态库中所有对象文件中的符号,并将它们分类
作为外部
或静态
。您已确认为\uuu declspec(dllexport)
将显示在所列的外部
符号中。功能始终可见,不是吗?我刚刚挂断了电话,因为无法看到他们使用dumpbin/exports。当我尝试链接时,我认为这些问题只是过时的头文件和.lib文件中的内容之间的差异。非常感谢您摘下了眼罩。。
dumpbin /option... static.lib
dumpbin /exports file.obj