1 主程序
cs
root@localhost:~/testc/testlink3# cat thanks.c
#include <stdio.h>
// 声明子程序
void thanks_2(void);
int main(void)
{
printf("Hello World\n");
thanks_2();
}
2 子程序
cs
root@localhost:~/testc/testlink3# cat thanks_2.c
#include <stdio.h>
void thanks_2(void)
{
printf("Thank you!\n");
}
3
3.1 编译源文件
使用GCC分别编译每个源文件。这将为每个源文件生成一个目标文件(.o 文件)。
cs
root@localhost:~/testc/testlink3# gcc -c thanks.c -o thanks.o
root@localhost:~/testc/testlink3# gcc -c thanks_2.c -o thanks_2.o
3.2 链接目标文件生成可执行文件
使用GCC链接这些目标文件,生成最终的可执行文件。
4 运行程序
bash
root@localhost:~/testc/testlink3# gcc thanks.o thanks_2.o -o program
root@localhost:~/testc/testlink3# ./program
Hello World
Thank you!
5 查看文件类型
bash
root@localhost:~/testc/testfather_son# ls|xargs file -i
program: application/x-executable; charset=binary
thx.c: text/x-c; charset=iso-8859-1
thx.o: application/x-object; charset=binary
thx_2.c: text/x-c; charset=us-ascii
thx_2.o: application/x-object; charset=binary
参考:
在Linux系统中使用GCC(GNU Compiler Collection)编译和链接C语言程序通常涉及以下几个步骤。我将通过一个简单的例子来说明如何将子程序(通常是多个源文件)和主程序链接在一起。
1. 创建源文件
首先,你需要创建两个C源文件:一个主程序文件和至少一个子程序文件。
main.c - 主程序文件
cs#include <stdio.h> // 声明子程序 int add(int a, int b); int main() { int result = add(5, 3); printf("Result: %d\n", result); return 0; }
math_functions.c - 子程序文件
cs#include <stdio.h> // 实现加法函数 int add(int a, int b) { return a + b; }
2. 编译源文件
使用GCC分别编译每个源文件。这将为每个源文件生成一个目标文件(.o 文件)。
csgcc -c main.c -o main.o gcc -c math_functions.c -o math_functions.o
3. 链接目标文件生成可执行文件
使用GCC链接这些目标文件,生成最终的可执行文件。
csgcc main.o math_functions.o -o program
4. 运行程序
现在你可以运行生成的可执行文件了。
bash./program
完整命令行示例
将上述步骤合并为一条命令行操作,如下所示:
bashgcc -o program main.c math_functions.c
这条命令会直接编译和链接所有指定的源文件,生成一个名为
program
的可执行文件。这种方法适用于源文件较少且不频繁修改的情况下。对于大型项目,建议分开编译和链接以加快编译速度并便于管理。使用Makefile进行项目管理(推荐)
对于大型项目,使用Makefile可以更有效地管理编译和链接过程。以下是一个简单的Makefile示例:
bashCC=gcc # 设置编译器为gcc CFLAGS=-Wall # 设置编译器选项,例如开启所有警告信息 TARGET=program # 设置目标可执行文件名 SOURCES=main.c math_functions.c # 设置源文件列表 OBJECTS=$(SOURCES:.c=.o) # 将源文件名转换为对象文件名,例如 main.c -> main.o all: $(TARGET) # 默认目标为$(TARGET)(即program) $(TARGET): $(OBJECTS) # 目标$(TARGET)依赖于所有对象文件$(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) -o $(TARGET) # 链接对象文件生成可执行文件 %.o: %.c # 模式规则,用于编译源文件生成对象文件 $(CC) $(CFLAGS) -c $< -o $@ # $< 表示依赖的第一个文件,$@ 表示目标文件(例如 main.o) clean: # 清理目标,删除所有对象文件和可执行文件 rm -f $(OBJECTS) $(TARGET) # 删除所有对象文件和可执行文件(如果有的话)
使用Makefile可以简化编译和清理过程,特别是在项目变得复杂时。你可以通过在终端中运行
make
命令来编译项目,或者使用make clean
来清理构建产物。