You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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路径
  • 切换到Linker settings标签,把ARM版的wx静态库添加进去,比如libwx_gtk2u_core-2.8.alibwx_baseu-2.8.alibwx_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

火山引擎 最新活动