为什么我不能为glib建立一个"hello world"?

mik*_*ike 44 c glib

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

#include <glib.h>
Run Code Online (Sandbox Code Playgroud)

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

test.c:1:18: error: glib.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

所以我确保我有合适的包裹:

# 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
Run Code Online (Sandbox Code Playgroud)

然后我在/ 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
Run Code Online (Sandbox Code Playgroud)

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

glibconfig.h我的计算机上似乎没有任何地方.

现在我该怎么做?

Chr*_*uin 52

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`
Run Code Online (Sandbox Code Playgroud)

注意后面的滴答声,它告诉shell"就地"运行pkg-config命令.

  • 这不是隐藏:glibconfig.h是一个与arch相关的数据列表,因此与/ usr/include无关.它常见于/ usr/lib/glib2/... (3认同)

tml*_*tml 40

> > The canonical way to do what you are trying is

> % gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`
Run Code Online (Sandbox Code Playgroud)

对不起,不行.这是一种常见的误解,在大多数情况下恰好适用于基于ELF的系统,特别是Linux.规范的方法是在命令行的正确和传统位置单独传递cflags和库,如下所示:

gcc -Wall -o test `pkg-config --cflags glib-2.0` test.c `pkg-config --libs glib-2.0`
Run Code Online (Sandbox Code Playgroud)

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

  • 对不起,但事实并非如此.您是否真的尝试过在某些非Linux平台上这样做,例如MinGW?例如,请参阅http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html,其中明确指出"它在您编写此选项的命令中有所不同;链接器搜索并处理库中的库和目标文件命令它们被指定.因此,`foo.o -lz bar.o'在文件foo.o之后但在bar.o之前搜索库`z'.如果bar.o引用`z'中的函数,那些函数可能不是装". (6认同)
  • 勇敢+1!严格来说,源代码文件的名称应该放在最后,在所有选项之后。 (2认同)

sob*_*ngt 7

至于@chris说使用pkg-config.

glibconfig.h is missing 
Run Code Online (Sandbox Code Playgroud)

这是因为这个文件不在/usr/include/glib-2.0,但是/usr/lib/glib-2.0.你必须包含这个/usr/lib路径或者将文件复制到/include/glib-2.0