Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的交叉编译失败了?_C_Gtk_Cross Compiling_Mingw32 - Fatal编程技术网

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

C 为什么我的交叉编译失败了?,c,gtk,cross-compiling,mingw32,C,Gtk,Cross Compiling,Mingw32,我是Linux编程新手,我正在尝试编译一个c文件,包括GTK+库。我的文件名为test.c,应该在Windows计算机上运行。我正在使用命令: i586-mingw32msvc-gcc `pkg-config --cflags gtk+-3.0` -o test test.c `pkg-config --libs gtk+-3.0` 我犯了一个可怕的错误,我试图自己找出哪里出了问题,但没能理解这里发生了什么 这是输出:您几乎可以肯定正在使用主机元数据文件运行pkg config,这样的输出可能

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

i586-mingw32msvc-gcc `pkg-config --cflags gtk+-3.0` -o test test.c `pkg-config --libs gtk+-3.0`
我犯了一个可怕的错误,我试图自己找出哪里出了问题,但没能理解这里发生了什么


这是输出:

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

尝试本教程,它将介绍如何执行您想要的操作,首先下载所需的GTK+-3.0 win32二进制文件,然后设置linux环境,以便
pkg config
获取目标元数据文件:

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

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

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

不过这里有一个小陷阱:
PKG_CONFIG_PATH
添加到搜索路径的开头,因此如果您没有在目标树中安装所需的软件,但安装了“本机”版本,它仍然可能返回到错误的包详细信息。您通常应该设置
PKG\u CONFIG\u LIBDIR
,这将替换默认路径(通常是
/usr/lib/pkgconfig
)。这样,当您交叉编译一些使用autoconf(
configure
scripts)的更复杂的东西时,您(希望)可以得到一个关于丢失包的合理诊断,而不是在编译过程中让轮子掉下来

例如,我可以使用它在一个交叉编译树中列出我拥有的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
会阻止它在my
/usr/local
中找到额外的包,设置
PKG_CONFIG_LIBDIR
意味着它找不到本机系统包。

除了设置
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
变量之外,可能需要将
--定义前缀
传递到
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

如果主机系统和交叉编译环境安装了相同的include文件,这可能会起作用。

请尝试始终以文本而不是图像的形式上载错误消息。另外,
pkg config
似乎添加了交叉编译器不知道的
-pthread
标志。您正在尝试使用Linux系统中的库交叉编译Windows二进制文件。您必须使用Windows库的库标志才能工作。您应该设置
PKG\u CONFIG\u SYSROOT\u DIR
环境变量,让
PKG CONFIG
知道在哪里查找Windows编译的库。