0

我正在使用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 文件来控制导出函数的确切列表来完成。

我的问题更为根本:为什么首先要导出这些符号?这是某个地方的错误吗?

4

0 回答 0