我正在尝试学习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的内容?)
答案 0 :(得分:6)
我不能为所有Linux回答问题,但是希望这能给您足够的答案来确定您自己系统的答案。
- cc如何链接到gcc
我们可以使用
$ 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
- 我们如何知道'make'遇到.c文件时的内部细节
给出文件hello.c
,然后我们可以使用make
选项检查-n
的作用:
$ make -n hello
cc hello.c -o hello
除此之外,您还可以参考系统版本make
的文档-例如GNU make: Catalogue of Rules