gpt4 book ai didi

linux - Linux中Make、Makefile、cc、gcc是怎么连接的?如何知道 'make' 将对 .c 文件做什么? ( 'make' 会调用 cc 还是 gcc?)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:05 24 4
gpt4 key购买 nike

我正在尝试学习 C,并且刚刚开始阅读“艰难地学习 C”这本书。在第二课中,作者提到了 Makefiles,并指出当使用命令“make example.c”时,“make”会自动调用 cc 来构建 .c 文件。出于好奇,我开始研究cc,因为我只熟悉gcc。根据用户 Jonathan Leffler 在 SO 的帖子“Difference between CC, gcc and g++?”中的说法,cc 通常链接到 Linux 中的 gcc。

所以这是我的问题:

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

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

最佳答案

我无法回答所有 Linux,但希望这能给您足够的信息来确定适合您自己系统的答案。

  1. How does cc link to 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

所以它是一个符号链接(symbolic link) - 但由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 本身可能是一个符号链接(symbolic link) - 指向特定版本的 gcc:

$ ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 5 Feb 11 2016 /usr/bin/gcc -> gcc-5
  1. How do we know the internal details of what 'make' will do when it encounters a .c file

给定一个文件 hello.c 然后我们可以使用 -n 选项检查 make 会做什么:

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

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

关于linux - Linux中Make、Makefile、cc、gcc是怎么连接的?如何知道 'make' 将对 .c 文件做什么? ( 'make' 会调用 cc 还是 gcc?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51510095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com