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。这只是一包目标文件 在Unix
ar
archive格式中(与MS
LIB
格式相同)

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