Linux下C程序的编写
第一部分:编写C程序并使用gcc编译器
首先,我们编写一个简单的C程序hello_gcc.c
,用于在屏幕上输出"Hello gcc!"。
c
// hello_gcc.c
#include <stdio.h>
int main() {
printf("Hello gcc!\n");
return 0;
}
然后,我们可以使用gcc编译器并带上不同的选项来观察生成的文件。
- 编译并生成可执行文件(不使用中间文件):
bash
gcc hello_gcc.c -o hello_gcc
- 编译并生成预处理文件(
.i
):
bash
gcc -E hello_gcc.c -o hello_gcc.i
- 编译预处理文件并生成汇编文件(
.s
):
bash
gcc -S hello_gcc.i -o hello_gcc.s
# 或者直接使用源文件,gcc会先预处理再生成汇编文件
gcc -S hello_gcc.c -o hello_gcc.s
- 编译汇编文件并生成目标文件(
.o
):
bash
gcc -c hello_gcc.s -o hello_gcc.o
# 或者直接从源文件编译到目标文件
gcc -c hello_gcc.c -o hello_gcc.o
- 链接目标文件并生成可执行文件:
bash
gcc hello_gcc.o -o hello_gcc
(注意:在实际操作中,通常不会单独编译汇编文件,而是直接从源文件编译到目标文件。)
第二部分:编写包含多个文件的C程序并编写Makefile
接下来,我们编写一个包含头文件greeting.h
、自定义函数文件greeting.c
和主函数文件myapp.c
的C程序。
greeting.h
(头文件):
c
// greeting.h
#ifndef GREETING_H
#define GREETING_H
void print_greeting();
#endif // GREETING_H
greeting.c
(自定义函数文件):
c
// greeting.c
#include <stdio.h>
#include "greeting.h"
void print_greeting() {
printf("Hello from greeting.c!\n");
}
myapp.c
(主函数文件):
c
// myapp.c
#include "greeting.h"
int main() {
print_greeting();
return 0;
}
然后,我们编写一个Makefile文件来管理这些文件的编译过程。
Makefile
:
makefile
# Makefile
CC=gcc
CFLAGS=-Wall
TARGET=myapp
SOURCES=$(wildcard *.c)
OBJECTS=$(SOURCES:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJECTS) $(TARGET)
在这个Makefile中,我们定义了编译器(CC)、编译选项(CFLAGS)、目标文件(TARGET)、源文件(SOURCES)、目标文件列表(OBJECTS)。我们还定义了all
和clean
两个目标,分别用于编译和清理生成的文件。
要使用这个Makefile,只需在终端中进入包含Makefile的目录,并运行make
命令即可编译程序。要清理生成的文件,可以运行make clean
命令。
编译程序:
bash
make
执行程序:
bash
./myapp
清理生成的文件:
bash
make clean