为啥我不能为 glib 构建一个“hello world”?

Posted

技术标签:

【中文标题】为啥我不能为 glib 构建一个“hello world”?【英文标题】:Why can't I build a "hello world" for glib?为什么我不能为 glib 构建一个“hello world”? 【发布时间】:2010-11-11 20:57:39 【问题描述】:

这是世界上最简单的 glib 程序:

#include <glib.h>

我尝试用gcc test.c 编译它,我得到:

test.c:1:18: error: glib.h: No such file or directory

所以我确保我有正确的包裹:

# dpkg -l | grep libglib
ii  libglib-perl                              1:1.183-1                               Perl interface to the GLib and GObject libra
ii  libglib1.2-dev                            1.2.10-19build1                         The GLib library of C routines (development)
ii  libglib1.2ldbl                            1.2.10-19build1                         The GLib library of C routines
ii  libglib2.0-0                              2.20.1-0ubuntu2                         The GLib library of C routines
ii  libglib2.0-cil                            2.12.1-1ubuntu2                         CLI binding for the GLib utility library 2.1
ii  libglib2.0-data                           2.18.2-0ubuntu2                         Common files for GLib library
ii  libglib2.0-dev                            2.20.1-0ubuntu2                         Development files for the GLib library
ii  libglibmm-2.4-1c2a                        2.18.1-1                                C++ wrapper for the GLib toolkit (shared lib

然后我在 /usr/include 下的任何位置搜索任何“glib.h”。我得到两个,/usr/include/glib-1.2/glib.h 和 /usr/include/glib-2.0/glib.h。所以我尝试:

$ gcc -I/usr/include/glib-2.0 -Wall test.c  
In file included from /usr/include/glib-2.0/glib/galloca.h:34,
             from /usr/include/glib-2.0/glib.h:32,
             from test.c:2:
/usr/include/glib-2.0/glib/gtypes.h:34:24: error: glibconfig.h: No such file or directory

(大约还有 10,000 个错误被剪掉)

我的电脑上似乎没有glibconfig.h

我现在该怎么办?

【问题讨论】:

也许我只是在傻,但是你为什么要编译一个头文件? 我从一个更复杂的程序开始,但如果 "#include " 不起作用,什么都不会。 如果你没有 main 函数,它将工作。用stdio.h 替换你的glib.h 也不起作用。假设您有一个主要功能,正确的答案是使用pkg-config,如其他答案中所述。 @YasushiShoji:如果 test.c 只包含 #include &lt;stdio.h&gt;gcc -c test.c 应该可以正常工作。添加第二行void test(void) 不会有什么坏处,但这不是必需的。在 OP 的情况下,无论#include &lt;glib.h&gt; 后面的内容如何,​​都会出现错误消息。 【参考方案1】:

glib 往往会隐藏自己...您的 include 语句不起作用,因为 GCC 不会自动搜索子目录,因此在 glib-1.2 或 glib-2.0 中看不到 glib.h。

阅读 GLIB 手册中的 Compiling GLib Applications 页面...您可以使用像 pkg-config --cflags glib-2.0 这样的命令来为 GCC 获取正确的标志。

做你正在尝试的事情的规范方法是

% gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`

注意反引号,它告诉外壳程序“就地”运行 pkg-config 命令。

【讨论】:

这不是隐藏的:glibconfig.h 是一个依赖于 arch 的数据列表,因此不属于 /usr/include。它通常位于 /usr/lib/glib2/...【参考方案2】:
> > The canonical way to do what you are trying is

> % gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`

对不起,没有。这是一个常见的误解,它恰好在大多数情况下适用于基于 ELF 的系统,尤其是 Linux。规范的方法是在命令行的正确和传统位置分别传入 cflags 和库,如下所示:

gcc -Wall -o test `pkg-config --cflags glib-2.0` test.c `pkg-config --libs glib-2.0`

遗憾的是 pkg-config 同时接受 --cflags 和 --libs 选项,因为这意味着这个不正确的 meme 永远不会消失,在 Linux 上习惯它的人会继续感到困惑然后他们在其他平台上尝试同样的方法。

【讨论】:

勇敢+1!严格来说,源代码文件的名称应该放在最后,在所有选项之后。 抱歉,这不是真的。您是否真的尝试在某些非 Linux 平台上这样做,例如 MinGW?参见例如gcc.gnu.org/onlinedocs/gcc/Link-Options.html,它清楚地表示“在您编写此选项的命令中会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o' searches library z' 在文件 foo 之后。 o 但在 bar.o 之前。如果 bar.o 引用 `z' 中的函数,则这些函数可能不会被加载”。【参考方案3】:

正如@chris所说,使用pkg-config

glibconfig.h is missing 

这是因为这个文件不在/usr/include/glib-2.0,而是在/usr/lib/glib-2.0. 所以你必须同时包含这个/usr/lib路径或者把文件复制到/include/glib-2.0

【讨论】:

【参考方案4】:

我也在使用 glib.h- 这样做可以编译所有 glib.h 程序 :)

gcc `pkg-config --cflags --libs glib-2.0` filename.c

确保用反引号括住 pkg-config --cflags --libs glib-2.0 您可以在波浪号(查询键盘上最左边的键)下找到它。

稍后谢谢我.. :P

【讨论】:

您是否介意在您的代码中添加“`”。这让我困惑了一段时间。承认我没有阅读您的其余答案是我的错,但是现在的代码 sn-p 不准确。【参考方案5】:

apt-get build-dep 是你的朋友——没有人能记住你构建某些东西所需的所有包。

【讨论】:

该文件可证明在那里,因此特定于 Debian 的包管理命令无法解决问题。正确使用pkg-config 会。

以上是关于为啥我不能为 glib 构建一个“hello world”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 GLib 函数?

为啥我在redhat5用./configure编译的时候出现以下报错 :no package 'glib-2.0 ' found

为啥我不能用 WITH_QT 构建 opencv?

可移植地在 autoconf/automake 中包含 GLib 标头

为啥在 Gradle 中不能将属性声明为输出?

为啥我不能从打包程序构建中运行“源”命令?