最近做一个项目,要移植Qt程序到开发板上。交叉编译Qt的时候带上了icu的选项,然而这个库还需要自己交叉编译。很久之前搞好过一次,现在系统炸了没备份又要重新搭环境。写个文章做个记录。
我按照github上面的教程(https://unicode-org.github.io/icu/userguide/icu4c/build.html)先编译x86版本的,后编译armhf版本。然后把so文件都复制到开发板,发现找不到libicudata.so,但是很明显目录下有这个文件。
我用readelf看了一下,发现这个库文件是soft-float ABI,其他都是hard-float的。开发板是需要hard-float的库。然后无论我怎么修改各种环境变量生成的都是soft-float版本的。
最后,在google上查了一圈,其实官网上也有说到这个icudata问题(https://unicode-org.github.io/icu/userguide/icu_data/#building-and-linking-against-icu-data) 大意就是,如果想要跨平台移植的话,应当在configure后的参数指明打包成文件形式。
--with-data-packaging=archive #或者是files
并在运行程序的时候指定环境变量ICU_DATA,即icu数据的目录
export ICU_DATA=$APP_DIR/share/icu/$ICU_VERSION/
而且就算不以这种方式编译,也会生成一个不带数据的libicudata.so在stubdata目录下面。链接这个库就可以解决问题了。
再次检查这个库的elf,发现已经是hard-float了
readelf -h libicudata.so