【问题标题】:Why does my cross-compiling fail?为什么我的交叉编译失败?
【发布时间】:2014-04-09 07:22:06
【问题描述】:

我是 Linux 编程的新手,我正在尝试编译一个包含 GTK+ 库的 c 文件。我的文件名为test.c,它应该可以在 Windows 计算机上运行。我正在使用命令:

i586-mingw32msvc-gcc `pkg-config --cflags gtk+-3.0` -o test test.c `pkg-config --libs gtk+-3.0`

我遇到了一个可怕的错误,我试图自己找出问题所在,但无法理解这里发生了什么。

这是输出:

【问题讨论】:

  • 请尝试始终以文本而不是图像的形式上传错误消息。此外,看起来pkg-config 添加了您的交叉编译器不知道的-pthread 标志。
  • 您正在尝试使用 Linux 系统中的库交叉编译 Windows 二进制文件。您必须使用 Windows 库的库标志才能使其正常工作。
  • 你应该设置可能设置PKG_CONFIG_SYSROOT_DIR 环境变量让pkg-config 知道在哪里寻找windows 编译的库。

标签: c gtk cross-compiling mingw32


【解决方案1】:

几乎可以肯定,您正在使用主机元数据文件运行pkg-config,这样的输出可能会使您的交叉编译器、erm、cross。

试试这个教程,它解释了如何从下载所需的 GTK+-3.0 win32 二进制文件开始,然后设置你的 linux 环境以便pkg-config 获取目标元数据文件:

http://www.tarnyko.net/en/?q=node/45

pkg-config 的工作是为一个程序提供一种直接的方法来确定编译器和链接器的要求,以及它使用的库的任何依赖库。它还使autoconf(和用户)更容易确定特定包的存在、版本和依赖关系。您的示例正在使用:

pkg-config --cflags gtk+-3.0
pkg-config --libs gtk+-3.0

这些将输出使用 gtk+-3.0 的程序所需的编译器和库标志。假设您的系统上安装了本机版本,默认输出将仅适用于您的系统类型(路径、库名称、依赖库等)。

交叉编译的诀窍是拥有一个单独的源树、.pc(pkg-config 元数据)、库和头文件(针对每个目标架构)。当您在配置/编译期间运行pkg-config 时,您可以按照上面的教程设置PKG_CONFIG_PATH,以便它为目标架构选择正确的.pc 文件。

这里有一个小陷阱:PKG_CONFIG_PATH添加到搜索路径的开头,所以如果你没有安装所需的软件,它仍然会退回到错误的包细节您的目标树,但您安装了“本机”版本。您通常应该设置PKG_CONFIG_LIBDIR,这会替换默认路径(通常是/usr/lib/pkgconfig)。这样,当您交叉编译使用 autoconf(configure 脚本)的更复杂的东西时,您(希望)能够对丢失的包进行合理的诊断,而不是在编译过程中让轮子脱落。

例如,我可以使用它来列出只是我在一个交叉编译树中拥有的 OpenWRT MIPS 包:

WRTROOT=/openwrt/staging_dir/target-mips_r2_uClibc-0.9.32/
PKG_CONFIG_PATH=  PKG_CONFIG_LIBDIR=${WRTROOT}/usr/lib/pkgconfig pkg-config --list-all

取消设置PKG_CONFIG_PATH 会阻止它在我的/usr/local 中找到额外的包,设置PKG_CONFIG_LIBDIR 意味着它不会找到本机系统的包。

【讨论】:

    【解决方案2】:

    除了设置PKG_CONFIG_PATHPKG_CONFIG_LIBDIR 变量之外,可能还需要将--define-prefix 传递给pkg-config

    PKG_CONFIG_PATH= PKG_CONFIG_LIBDIR=/openwrt/staging_dir/target-mips_34kc_eglibc-2.19/usr/lib/pkgconfig pkg-config --define-prefix --cflags libmodbus
    -I/openwrt/staging_dir/target-mips_34kc_eglibc-2.19/usr/include/modbus
    

    否则,您将获得主机系统上的包含路径:

    PKG_CONFIG_PATH= PKG_CONFIG_LIBDIR=/openwrt/staging_dir/target-mips_34kc_eglibc-2.19/usr/lib/pkgconfig pkg-config --cflags libmodbus
    -I/usr/include/modbus
    

    如果主机系统和交叉编译环境安装了相同的包含文件,可能可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多