0

我刚刚开始学习“make”命令和其他从中派生的东西。我得到了这个很好的参考 html 页面,它教会了我关于“制作”概念 http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_makefiles.html 它说,像这样

引用:

*# define any directories containing header files other than /usr/include
#
INCLUDES = -I/home/newhall/include  -I../include
# define library paths in addition to /usr/lib
#   if I wanted to include libraries not in /usr/lib I'd specify
#   their path using -Lpath, something like:
LFLAGS = -L/home/newhall/lib  -L../lib
# define any libraries to link into executable:
#   if I want to link in libraries (libx.so or libx.a) I use the -llibname 
#   option, something like (this will link in libmylib.so and libm.so:
LIBS = -lmylib -lm*

好吧,这是我不明白的事情。我不明白为什么你必须包括

用 INCLUDES 和 LFLAGS 分开头文件。/usr/lib 和 /usr/include 中的文件有什么区别?对我来说似乎几乎相同,因为两者都包含不是共享对象(+archieves)或环境路径中的头文件路径。

另外,由于 usr/include 是编译时的默认路径,是否也包含子目录中的所有文件?例如,我想做的是,我想包含 /usr/include/gtk+-3.0 作为附加路径,但由于它是子目录,我是否必须包含它?

4

3 回答 3

2

实际上这不包括任何头文件或库,该-I选项告诉编译器在哪里找到包含在源代码中的头文件(标准头文件除外),#include-L告诉链接器在哪里找到与-l选项链接的库。

换句话说,他们将目录添加到搜索路径,而不是实际的标题或库......

变量名称是完全任意的,但它们确实表明哪些选项属于哪个工具,例如 LFLAGS(链接器标志)CFLAGS(编译器标志)。

/usr/lib并且/usr/include通常分别包含系统库和头文件。

我建议您在开始制作之前阅读更多关于 C 和 GCC 的信息,因为它只是用于编写编译过程的脚本。

于 2013-08-06T06:37:03.643 回答
0

/usr/lib包含链接到可执行文件的目标文件库。/usr/include包含头文件,其中包含与库一起使用的函数、类型和结构的声明。它们是两个不同的东西。

于 2013-08-06T06:29:09.510 回答
0
  1. INCLUDES 指定编译器将搜索包含在程序中的 .c 和 .h 文件的路径。即,如果您在程序中写入包含 test.h,编译器将在您的 C 文件的同一目录以及您在 make 文件中使用 INCLUDES 指定的目录中进行搜索。

  2. LFLAGS 指定库路径。其中包含您用于程序的库。将其与 INCLUDES 区分开来的原因是 INCLUDES 包含源文件,而 LFLAGS 仅包含二进制文件。并且对于分发任何 C 实用程序,其标准约定是使用两个不同的文件夹来存放源代码和库。

  3. 要使用位于 /usr/include/gtk+-3.0 中的文件,您可以将其包含为 #include "gtk+-3.0/filename.h"。由于 /usr/include 包含在您的 INCLUDES 中,您可以提供该目录的相对路径。

于 2013-08-06T09:47:30.157 回答