为什么我的交叉编译失败了?

时间:2014-03-06 15:01:40

标签: c gtk cross-compiling mingw32

我是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`

我收到了一个可怕的错误,我试图弄清楚自己出了什么问题,但却无法理解这里发生了什么。

这是输出:compiler output

2 个答案:

答案 0 :(得分:6)

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

尝试本教程,它解释了如何从下载所需的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意味着它找不到原生系统包。

答案 1 :(得分:0)

除了设置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
如果主机系统和交叉编译环境安装了相同的包含文件,那么可能工作