我正在使用MXE构建我自己的交叉编译器工具链(这个特定版本)。只有我不使用默认的 gcc 5.5,而是使用 gcc 6.3.0。
我没有特别绑定到那个版本 - 我只是选择它,因为它也被用来生成最新的 portaudio 二进制文件
似乎出于某种原因,portaudio DLL 中包含并导出了一些 MSVCRT 符号:
dumpbin /exports libportaudio64bit.dll
992 3DF 00032F30 mbrlen
993 3E0 00032D90 mbrtowc
994 3E1 00032E00 mbsrtowcs
1112 457 00033180 wcrtomb
1113 458 000331C0 wcsrtombs
我只是因为我试图交叉编译和构建bzip2 1.0.8才发现 它已经很老了,而且它没有所有的基础设施来支持交叉编译。然而,它可以通过几个非常简单的步骤手动完成:
make CC=x86_64-w64-mingw32.shared-gcc AR=x86_64-w64-mingw32.shared-ar RANLIB=x86_64-w64-mingw32.shared-ranlib libbz2.a
x86_64-w64-mingw32.shared-gcc *.o -s -shared -o libbz2-1.dll
与 portaudio DLL 类似,上面导出相同的符号:
dumpbin /exports libbz2-1.dll
36 23 00012B60 mbrlen
37 24 000129F0 mbrtowc
38 25 00012A60 mbsrtowcs
39 26 00012DC0 wcrtomb
40 27 00012E00 wcsrtombs
不用说,由于同一符号 ( mingw-w64-v8.0.0/mingw-w64-crt/misc/mbrtowc.c:98: multiple definition of 'mbrtowc' - x86_64-w64-mingw32.shared/lib/../lib/libmsvcrt.a(lib64_libmsvcrt_os_a-mbrtowc.o): first defined here
)的多个定义,这会导致链接时出现问题
我的问题不是如何避免这个问题。这可以通过在构建 DLL 时使用 DEF 文件来控制导出函数的确切列表来完成。
我的问题更为根本:为什么首先要导出这些符号?这是某个地方的错误吗?