1

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

我采取的步骤如下所示:

  1. 从这里获取最新的源代码存档并提取它。

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

  3. 对于主机构建:

    。/配置 ; 制作
  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): 未定义引用`_uconvmsg_dat'

什么可能导致此错误?我备份了几行,也注意到了这一点:

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
无法导出 icudt50_dat:找不到符号
collect2: ld 返回 1 个退出状态
-- 返回状态 = 256
生成库文件时出错。失败的命令: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   
为数据生成汇编代码时出错。

我究竟做错了什么?

4

2 回答 2

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

于 2013-02-13T22:14:36.040 回答
0

所以事实证明问题确实出在ICU源代码上。我不确定我是否完全理解问题所在,但幸运的是其他人做了并编写了三个补丁。

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

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

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

于 2013-02-14T06:57:28.130 回答