cc -c -o的使用

在一个文件夹下一共四个文件

function.h

#ifndef __FUNCTION_H__
#define __FUNCTION_H__


void func();
#endif


function.c

#include<stdio.h>
#include "function.h"


void func()
{
    printf("this is function.c");
}


test.c

#include <stdio.h> 
#include "function.h"
void main() { 
   func();
   printf("Hello world!\n");


}

Makefile

default: function.o test.o
cc -o test function.o test.o
#tab 开头
function.o: function.c function.h
cc -c function.c
test.o: test.c function.h
cc -c test.c


执行make操作

root@ubuntu:/var/test# make
cc -c function.c
cc -c test.c
cc -o test function.o test.o


root@ubuntu:/var/test# ll
total 40
drwxr-xr-x  2 root root 4096 Apr  7 17:33 ./
drwxr-xr-x 15 root root 4096 Mar 24 17:44 ../
-rw-r--r--  1 root root   91 Mar 24 17:44 function.c
-rw-r--r--  1 root root   67 Mar 24 17:44 function.h
-rw-r--r--  1 root root 1024 Apr  7 17:33 function.o
-rw-r--r--  1 root root  161 Mar 24 17:52 Makefile
-rwxr-xr-x  1 root root 7377 Apr  7 17:33 test*
-rw-r--r--  1 root root  100 Mar 24 17:44 test.c
-rw-r--r--  1 root root 1052 Apr  7 17:33 test.o


root@ubuntu:/var/test# ./test
this is function.cHello world!

生成 `world.out` 的规则和执行过程通常涉及 `Makefile` 中定义的目标依赖关系和编译命令。根据典型的 `Makefile` 结构,生成 `world.out` 的规则通常类似于以下形式: ```makefile world.out: main.o utils.o gcc main.o utils.o -o world.out ``` 在上述规则中,`world.out` 是目标文件,它依赖于 `main.o` 和 `utils.o` 两个目标文件。如果 `world.out` 比其依赖的任何一个 `.o` 文件旧,或者 `world.out` 尚未生成,则 `Makefile` 会执行链接命令 `gcc main.o utils.o -o world.out` 来生成最终的可执行文件 [^2]。 ### 依赖关系解析 `Makefile` 的执行过程从第一条规则开始。在生成 `world.out` 的规则中,`make` 首先检查 `main.o` 和 `utils.o` 是否存在,并且是否比对应的源文件(如 `main.c` 和 `utils.c`)更新。如果源文件比目标文件新,`make` 会执行相应的编译命令来生成 `.o` 文件。例如: ```makefile main.o: main.c gcc -c main.c -o main.o utils.o: utils.c gcc -c utils.c -o utils.o ``` 在上述规则中,`main.o` 依赖于 `main.c`,而 `utils.o` 依赖于 `utils.c`。如果这些源文件比目标文件新,或者目标文件不存在,则会执行 `gcc -c main.c -o main.o` 和 `gcc -c utils.c -o utils.o` 命令来生成对应的目标文件。 ### 执行流程 1. `make` 开始执行时,首先检查 `world.out` 是否存在,并且是否比 `main.o` 和 `utils.o` 旧。 2. 如果 `world.out` 不存在,或者其比任意一个 `.o` 文件旧,则 `make` 会检查 `.o` 文件的依赖关系。 3. 对于 `main.o` 和 `utils.o`,`make` 会检查对应的源文件 `main.c` 和 `utils.c`,以确定是否需要重新编译。 4. 如果源文件比目标文件新,或者目标文件不存在,则执行编译命令生成 `.o` 文件。 5. 一旦所有 `.o` 文件都更新完成,`make` 会执行链接命令生成最终的 `world.out`。 ### 示例代码 以下是一个完整的 `Makefile` 示例,用于生成 `world.out`: ```makefile world.out: main.o utils.o gcc main.o utils.o -o world.out main.o: main.c gcc -c main.c -o main.o utils.o: utils.c gcc -c utils.c -o utils.o ``` 在执行 `make` 命令时,`make` 会根据文件的时间戳决定是否需要重新编译或链接。 ### 执行结果 如果所有文件都已更新,则 `make` 会提示 `world.out` 已是最新的。如果需要更新,则会执行编译和链接命令生成新的 `world.out`。例如: ```bash $ make gcc -c main.c -o main.o gcc -c utils.c -o utils.o gcc main.o utils.o -o world.out ``` 在上述示例中,`make` 重新编译了 `main.o` 和 `utils.o`,并链接生成了 `world.out`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值