使用Code::Blocks交叉编译ARM平台wxWidgets项目报错求助
解决Code::Blocks交叉编译wxWidgets到BeagleBone Black的问题
兄弟,你这是踩了交叉编译GUI库的经典坑——直接用x86平台编译好的wxWidgets库去链接ARM目标代码,这肯定会报错的。我之前做嵌入式GUI项目时也遇到过一模一样的问题,下面是亲测有效的解决步骤:
1. 必须先交叉编译ARM版本的wxWidgets 2.8
你本地编译的wx库是针对x86架构的,根本没法在ARM平台上用,得重新给arm-linux-gnueabi工具链编译一套适配版本:
- 先解压wxWidgets 2.8的源码包,进入源码根目录
- 推荐创建单独的编译目录(out-of-tree编译,不会污染源码):
mkdir build-arm && cd build-arm - 运行配置命令,参数要精准对应ARM平台:
../configure --host=arm-linux-gnueabi --prefix=/home/your-user/arm-wx2.8 \ --enable-unicode --disable-shared --enable-static \ --with-gtk=2 --without-libtiff --without-libjpeg --without-libpng--prefix指定ARM版wx的安装路径,选个你容易找到的位置,后续Code::Blocks要用到这里的库和头文件--disable-shared --enable-static是编译静态库,这样最终程序可以直接在BBB上运行,不用额外拷贝动态库,适合嵌入式设备场景
- 编译安装:
make -j$(nproc) && make install(-j$(nproc)会自动用满你的CPU核心,加快编译速度)
2. 给Code::Blocks的交叉编译工具链配置wx路径
打开你的Hello World项目,一步步调整配置:
- 先进入Settings > Compiler...,确认当前选中的是你配置的
arm-linux-gnueabi工具链 - 切换到Search directories标签:
- Compiler:添加刚才编译的ARM版wx的
include路径,比如/home/your-user/arm-wx2.8/include - Linker:添加
/home/your-user/arm-wx2.8/lib路径
- Compiler:添加刚才编译的ARM版wx的
- 切换到Linker settings标签,把ARM版的wx静态库添加进去,比如
libwx_gtk2u_core-2.8.a、libwx_baseu-2.8.a、libwx_gtk2u_adv-2.8.a(默认Hello World项目用这几个就够了) - 最后打开项目的Build options,确保项目使用的是这个交叉编译工具链,并且路径设置覆盖了全局默认配置(避免仍调用x86版本的库)
3. 检查BBB上的运行依赖(仅动态编译场景)
要是你刚才没加--disable-shared,编译的是动态库,那得把编译出来的libwx_*.so文件拷贝到BBB的/usr/lib目录下,不然程序会因为找不到依赖而无法启动。还是更推荐静态编译,省得折腾依赖问题。
4. 常见报错快速排查
如果还是报错,先抓准具体错误信息针对性解决:
- 出现
undefined reference to wxXXX:大概率是链接到了x86版本的wx库,检查搜索路径顺序,把ARM版的库路径拖到最前面 - 出现
cannot find -lwxXXX:说明没找到ARM版的库文件,去你设置的prefix路径下的lib目录确认是否存在对应库,或者重新运行configure时有没有报错 - 编译时头文件报错:大概率是头文件路径没加对,或者configure参数有误——注意wxWidgets 2.8仅支持GTK2,别写成GTK3了
对了,wxWidgets 2.8确实比较老旧,如果BBB装的是较新的Debian/Ubuntu系统,可能GTK2的依赖会有兼容性问题,要是实在卡壳,也可以试试升级到wxWidgets 3.x,交叉编译流程类似,但对新系统的兼容性更好。
内容的提问来源于stack exchange,提问作者carlos




