【问题标题】:How are Make, Makefile, cc, and gcc connected in Linux? How to know what 'make' will do with a .c file? (Will 'make' call cc or gcc?)Linux 中 Make、Makefile、cc 和 gcc 是如何连接的?如何知道 'make' 会对 .c 文件做什么? ('make' 会调用 cc 还是 gcc?)
【发布时间】:2018-07-25 00:33:40
【问题描述】:

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

所以这是我的问题:

1) cc 在 Linux 中是如何链接到 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 makefile gcc


    【解决方案1】:

    我无法回答所有 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,然后我们可以使用-n 选项检查make 将做什么:

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

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

    【讨论】:

    • 非常感谢您的回复。我在 Linux 'man'/manual 页面上花费了数小时,并且使用 Google 搜索无济于事,感谢您的解释和信息。
    • 进程可以读取调用它的命令。这意味着它可以区分它是被称为cc 还是gcc,并根据您启动它的方式执行不同的操作。您可能无法将cc 替换为gcc。检查手册页。目前,man cc为您提供gcc 的手册页,因此它们目前可以互换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-04-24
    • 2010-10-20
    • 2010-09-06
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多