【问题标题】:how gcc automatically know to include glib librarygcc 如何自动知道包含 glib 库
【发布时间】:2014-02-05 11:44:15
【问题描述】:

我在 C 中使用glib.h 编写了一个简单的程序,但是当我编译它时出现如下错误:

$ gcc test.c -o test
test.c:3:18: fatal error: glib.h: No such file or directory
compilation terminated.

所以从上面看来 gcc 找不到 glib.h 文件(这是 libglib2.0-dev 包的一部分并且已经安装了它)。所以首先我尝试在我的系统中找到glib.h 文件并找到如下输出:

$ locate glib.h
/usr/src/linux-headers-3.2.0-29-generic-pae/include/config/blk/dev/bsglib.h
/usr/src/linux-headers-3.2.0-48-generic-pae/include/config/blk/dev/bsglib.h
/usr/src/linux-headers-3.2.0-57-generic-pae/include/config/blk/dev/bsglib.h

然后我尝试了命令:

$ pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include  

为 GCC 获取正确的标志,但仍然显示相同的错误。

因此尝试从 SO 中找到解决方案并找到确切的解决方案,例如

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

这个命令解决了我的问题

但我有疑问,没有任何方法可以告诉 gcc 包含 glib 库,因此不需要在 gcc 之后给出标志 pkg-config --cflags --libs glib-2.0 并且只需通过 gcc test.c -o test 编译我的文件?

【问题讨论】:

  • 了解如何使用make。请参阅this answer 来回答一个非常相似的问题。并且不要将您的可执行文件命名为test;它是一个有用的内置 shell,或 /usr/bin/test,参见 test(1)...
  • 是的,我知道make。我只是通过make test pkg-config --cflags --libs glib-2.0 编译我的源代码。并感谢建议在二进制和内置 shell 之间进行名称混淆。
  • 只需要写一个Makefile(一次,然后用代码升级它)然后输入make来构建你的程序。

标签: c linux gcc ubuntu-12.04 glibc


【解决方案1】:

没有。

查看 C 源代码并弄清楚它使用了哪些库是非常困难的。这对我来说有点像"AI complete",这就是为什么它通常由程序员手动解决,指出正确的库来满足依赖关系。

就 glib 而言,很容易想象一个同时安装了 glib 1.x 和 2.x 版本的系统,并且某些调用的名称完全相同。现在试着想象一个计算机程序能够解释你的意思,链接到哪个库。这是不可能的,因为只有程序员知道。

pkg-config 工具有助于了解每个库使用所需的机制,但仍然由你来告诉它(通过模块名称参数)哪个要使用的确切库。

【讨论】:

  • 好的,但是如果我从终端执行pkg-config --cflags glib-2.0 命令,那么它是否包含 glib 库的路径?如果是,那么在它之后我的命令gcc test.c -o test 必须工作。
  • 是的,它为您提供了 glib-2.0 包的包含路径,它是 glib 库的 2.x 版本。但是这些信息当然必须以某种方式传递给 gcc,这并不是说 gcc 就在你的肩膀上阅读你的终端......
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多