【问题标题】:How to use Cross Linker instead of native linker如何使用交叉链接器而不是本机链接器
【发布时间】:2016-01-05 06:47:10
【问题描述】:

我正在尝试使用 OpenWRT 提供的工具链交叉编译 MIPS 架构的包。我在制作过程中遇到以下错误:

/usr/bin/ld: skipping incompatible /home/user/package/zlib/zlib-1.2.8/libz.so when searching for -lz

在这种情况下,zlib 已经为 MIPS 进行了交叉编译,但 make 使用的是 '/usr/bin/ld' 而不是 'mipsel-openwrt-linux-ld'。我试过 ./configure 与 --with-ld 选项,但它说 '--with-ld' 是未知选项。

【问题讨论】:

    标签: c++ c linker makefile


    【解决方案1】:

    您是否查看了以下页面,https://wiki.openwrt.org/doc/devel/crosscompile

    将宿主机和构建传递给包的构建系统触发交叉编译

    对于 GNU 配置,使用 --build=architecture-unkown-linux-gnu --host=architecture-openwrt-linux-uclibc(例如:./configure --build=x86_64-unkown-linux-gnu --host =mips-openwrt-linux-uclibc)

    运行 ./config.guess 以获取 --build= 选项。

    检查输出并确保“检查我们是否正在交叉编译...是”为是。

    对于 GNU make,覆盖 CC 和 LD 环境变量(如果使用 GNU configure,通常不需要)

    制作 CC=architecture-openwrt-linux-uclibc-gcc LD=architecture-openwrt-linux-uclibc-ld

    【讨论】:

    • 感谢您的回复。我尝试了您提到的步骤,但也没有用。我猜 ./configure 脚本存在一些问题,无法设置 LD 变量。
    • 最后一行make CC=architecture-openwrt-linux-uclibc-gcc LD=architecture-openwrt-linux-uclibc-ld怎么样?你遇到了什么错误?
    • 试过但没有成功。为这个架构找到了一些预构建的包,所以我的挣扎结束了。
    【解决方案2】:

    我知道这两年了。我在为 OpenWrt 构建外部包时遇到了同样的问题。

    至于最近的 OpenWrt,你至少设置了两个 ENV 变量:

    1. 将您的 Path_to_OpenWrt/staging_dir/toolchain-*/bin 路径添加到您的 PATH ENV 变量中
    2. 将您的 Path_to_OpenWrt/staging_dir 设置为您的 STAGING_DIR ENV 变量

    您现在应该能够使用 AC_CANONICAL_HOST 编译基于 autoconf 的项目(在 configure.ac 中查找)和 ./configure --host=architecture-openwrt-linux

    您可能需要设置更多 ENV 变量,例如PKG_CONFIG_PATH, PKG_CONFIG_LIBDIR 使 pkg-config 正常工作。

    我编写了一个 bash 脚本,它可以为您完成所有工作: sdkenv.sh。 您可以在配置之前使用source sdkenv.sh 激活脚本。

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2018-07-11
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多