交叉编译

也许你想使用一个程序, 但它目前并没有被包含在OpenWrt的仓库中, 那你应该找不到其针对你的CPU编译出来的二进制发布版. 在它是开源的前提下, 你可以下载其源码, 并使用OpenWrt Buildroot进行编译.

注: 并非所有代码都适合每种架构的CPU. 而且嵌入式系统的性能相对普通电脑来说有不少限制.

  • 遵循OpenWrt Buildroot – Usage中的构建指令概述.
  • 将toolchain的二进制文件放在 staging_dir/toolchain-architecture_gcc-compilerver_uClibc-libcver/bin/ 目录中.
  • 将上述目录加入 PATH 环境变量:
    • PATH=$PATH:(将你的 toolchain/bin 目录放在这里)
    • export PATH
  • 设置 STAGING_DIR 环境变量, 指向上述toolchain目录并导入它:
    • STAGING_DIR=(将你的toolchain目录放在这里)
    • export STAGING_DIR
  • 下载并解压需要编译的代码, 进入代码目录
  • hostbuild 传递给软件包构建系统来触发交叉编译
    • 针对 GNU configure, 使用 --build=architecture-unknown-linux-gnu --host=architecture-openwrt-linux-uclibc (例如: ./configure --build=x86_64-unknown-linux-gnu --host=mips-openwrt-linux-uclibc)
      • 运行 ./config.guess 来获取 --build= 选项.
      • 检查输出并确认 'checking whether we are cross compiling... yes' 是yes.
    • 针对 GNU make, 重写 CCLD 环境变量 (如果使用GNU configure的话, 通常不需要)
      • make CC=architecture-openwrt-linux-uclibc-gcc LD=architecture-openwrt-linux-uclibc-ld
  • 编译好的程序会生成在执行./configure 以及 make 的目录中的某个地方, 可以试试 find -iname *program*
  • 运行 file program 来确认交叉编译是否成功.
  • 如果编译因为缺少头文件或动态库而失败, 也许需要重写 CFLAGSLDFLAGS 来指明 staging_dir/target-architecture_uClibc-libcver/usr/include.../usr/lib 目录.
  • 在toolchain中Debugging需要gdb. 默认配置并不包含它. 可以用make menuconfig来加入. [Advanced configuration options→Toolchain Options→Build gdb]
  • 可以使用 ./scripts/remote-gdb 进行远程Debugging.

编译完成后, 则可以拷贝结果二进制文件和相关库文件到目标设备进行测试. 可能也需要在目标设备中设置 LD_LIBRARY_PATH 来指明二进制文件所需的非标准位置的库路径.

如果程序运行地足够好, 也许你会想把它构建成一个真正的软件包, 提供给opkg manager以便让所有人都能很容易地访问. 参考 Creating your own packages and Using Dependencies 获取更多相关信息.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2021/10/15 09:06
  • by bobafetthotmail