在Linux中如何连接Make,Makefile,cc和gcc?如何知道.c文件的“ make”字样? (“ make”会呼叫cc还是gcc?)

时间:2018-07-25 00:33:40

标签: linux makefile gcc

我正在尝试学习C,并且刚开始写《艰苦学习C》一书。在第二课中,作者提到了Makefile,并指出当使用命令“ make example.c”时,“ make”将自动调用cc来构建.c文件。出于好奇,我开始研究cc,因为我只熟悉gcc。用户Jonathan Leffler在SO的帖子“ Difference between CC, gcc and g++?”中表示,cc通常链接到Linux中的gcc。

这是我的问题:

1)cc如何在Linux中链接到gcc?这似乎是一个简单的问题,但我无法确定它是否需要基本答案或高级操作系统答案。 (似乎cc并不是一个环境变量,正如一个用户在Red Hat Linux上使用“ env >> env_vars.txt”进行检查然后读取文本文件env_vars.txt的内容后在SO上声称的那样。)

2)我们如何知道'make'遇到.c文件(或任何其他文件)时的内部细节?例如,对于.c文件,我们如何确切地知道或确认'make'将调用cc,而不是直接使用.c文件调用gcc? (“ make”是否引用默认的Makefile?如果这样,我们如何读取该默认Makefile的内容?)

1 个答案:

答案 0 :(得分:6)

我不能为所有Linux回答问题,但是希望这能给您足够的答案来确定您自己系统的答案。

  
      
  1. cc如何链接到gcc
  2.   

我们可以使用

$ type cc
cc is /usr/bin/cc

那么/usr/bin/cc是什么?

$ ls -l /usr/bin/cc
lrwxrwxrwx 1 root root 20 Jun 29  2016 /usr/bin/cc -> /etc/alternatives/cc

所以它是一个符号链接-但这是由alternatives系统管理的。我们可以查询:

$ update-alternatives --query cc
Name: cc
Link: /usr/bin/cc
Slaves:
 cc.1.gz /usr/share/man/man1/cc.1.gz
Status: auto
Best: /usr/bin/gcc
Value: /usr/bin/gcc

Alternative: /usr/bin/clang
Priority: 10
Slaves:

Alternative: /usr/bin/gcc
Priority: 20
Slaves:
 cc.1.gz /usr/share/man/man1/gcc.1.gz

所以cc确实链接到/usr/bin/gcc

请注意,/usr/bin/gcc本身可能是符号链接-指向gcc的特定版本:

$ ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 5 Feb 11  2016 /usr/bin/gcc -> gcc-5
  
      
  1. 我们如何知道'make'遇到.c文件时的内部细节
  2.   

给出文件hello.c,然后我们可以使用make选项检查-n的作用:

$ make -n hello
cc     hello.c   -o hello

除此之外,您还可以参考系统版本make的文档-例如GNU make: Catalogue of Rules