簡體   English   中英

在Linux中如何連接Make,Makefile,cc和gcc? 如何知道.c文件的“ make”字樣? (“ make”會呼叫cc還是gcc?)

[英]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?)

我正在嘗試學習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我們可以使用-n選項檢查make可以執行的操作:

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

除此之外,您還可以參考系統版本的make的文檔-例如GNU make:規則目錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM