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

AGéoCoder:

我正在尝试学习C,只是刚开始写“很难学C”一书。在第二课中,作者提到了Makefile,并指出当使用命令“ make example.c”时,“ make”将自动调用cc来构建.c文件。出于好奇,我开始研究cc,因为我只熟悉gcc。根据用户Jonathan Leffler在SO的文章“ CC,gcc和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的内容?)

螺丝刀:

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

  1. 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
  1. 我们如何知道'make'遇到.c文件时将执行的内部详细信息

给定一个文件,hello.c我们可以make使用以下-n选项检查将执行的操作

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

除此之外,您可以参考系统版本的文档make-例如GNU make:规则目录

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章