在交叉编译ICU for Windows时导出符号时出错。

时间:2013-02-13 21:42:24

标签: windows cross-compiling icu

我试图使用Mingw-w64的32位编译器(i686-w64-mingw32工具链)来交叉编译Windows的ICU库。主机是Ubuntu 12.10 64位。

我采取的步骤如下:

  1. here抓取最新的源代码存档并解压缩。

  2. 制作source/目录的两个副本 - 一个用于主机,一个用于目标。

  3. 对于主机构建:

    ./configure ; make
  4. 对于目标版本:

    ./configure --host=i686-w64-mingw32 --with-cross-build=<host_source_dir>

    ...其中<host_source_dir>是上一步的目录。

  5. 当我在目标源目录中运行make时,编译过程中没有任何错误,然后抛出此错误:

    i686-w64-mingw32-g++ -O2 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings
    -Wno-long-long -mthreads  -o ../../bin/uconv.exe uconv.o uwmsg.o
    -L../../lib -licuin50 -L../../lib -licuuc50 -L../../stubdata -licudt50
    -lm   uconvmsg/uconvmsg.a
    uconv.o:uconv.cpp:(.text+0x2f): undefined reference to `_uconvmsg_dat'
  6. 可能导致此错误的原因是什么?我支持了几行,并注意到了这一点:

    pkgdata: i686-w64-mingw32-gcc -O2 -Wall -std=c99 -pedantic -Wshadow
      -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -mthreads  -shared
      -Wl,-Bsymbolic -Wl,--enable-auto-import -Wl,--out-implib=./all.lib  -o
      ../lib/icudt50.dll ./out/tmp/icudt50l_dat.o
    Cannot export icudt50_dat: symbol not found
    collect2: ld returned 1 exit status
    -- return status = 256
    Error generating library file. Failed command: i686-w64-mingw32-gcc -O2 -Wall
      -std=c99 -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes
      -Wwrite-strings -mthreads -shared -Wl,-Bsymbolic -Wl,--enable-auto-import
      -Wl,--out-implib=./all.lib -o ../lib/icudt50.dll ./out/tmp/icudt50l_dat.o   
    Error generating assembly code for data.

    我做错了什么?

2 个答案:

答案 0 :(得分:0)

为了调试您的符号问题,只需将-Wl,--trace-symbol=_uconvmsg_dat标记提供给i686-w64-mingw32-g++,如下所示:

i686-w64-mingw32-g++ -O2 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -mthreads -o ../../bin/uconv.exe uconv.o uwmsg.o -L../../lib -licuin50 -L../../lib -licuuc50 -L../../stubdata -licudt50 -lm uconvmsg/uconvmsg.a -Wl,--trace-symbol=_uconvmsg_dat

答案 1 :(得分:0)

事实证明问题确实与ICU源代码有关。我不确定我究竟是什么问题,但幸好其他人做了并写了三个补丁。

前两个适用于我上面的问题:

在构建x86_64架构时,使用第三个补丁而不是上面列表中的第二个补丁:

运行make install时似乎仍然存在问题,但至少源代码树似乎现在正在构建。