当前位置: 首页 > news >正文

linux (CentOS 10)使用传统程序语言(C)进行编译---主,子程序连接:子程序的编译

1 主程序

root@localhost:~/testc/testlink3# cat thanks.c
#include <stdio.h>
// 声明子程序
void thanks_2(void);
int main(void)
{
        printf("Hello World\n");
        thanks_2();
}

2 子程序

root@localhost:~/testc/testlink3# cat thanks_2.c
#include <stdio.h>
void thanks_2(void)
{
        printf("Thank you!\n");
}

3

3.1 编译源文件

使用GCC分别编译每个源文件。这将为每个源文件生成一个目标文件(.o 文件)。

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 运行程序

root@localhost:~/testc/testlink3# gcc thanks.o thanks_2.o -o program
root@localhost:~/testc/testlink3# ./program 
Hello World
Thank you!

5 查看文件类型
 

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 - 主程序文件
 

#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 - 子程序文件

#include <stdio.h>
 
// 实现加法函数
int add(int a, int b) {
    return a + b;
}

2. 编译源文件

使用GCC分别编译每个源文件。这将为每个源文件生成一个目标文件(.o 文件)。

gcc -c main.c -o main.o
gcc -c math_functions.c -o math_functions.o

3. 链接目标文件生成可执行文件

使用GCC链接这些目标文件,生成最终的可执行文件。

gcc main.o math_functions.o -o program

4. 运行程序

现在你可以运行生成的可执行文件了。

./program

完整命令行示例

将上述步骤合并为一条命令行操作,如下所示:

gcc -o program main.c math_functions.c

这条命令会直接编译和链接所有指定的源文件,生成一个名为program的可执行文件。这种方法适用于源文件较少且不频繁修改的情况下。对于大型项目,建议分开编译和链接以加快编译速度并便于管理。

使用Makefile进行项目管理(推荐)

对于大型项目,使用Makefile可以更有效地管理编译和链接过程。以下是一个简单的Makefile示例:

CC=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来清理构建产物。

相关文章:

  • 新球体育比分状态监控
  • 【工具】Redis管理工具推荐
  • Spring Boot + MyBatis + Maven论坛内容管理系统源码
  • 阿里云域名证书自动更新acme.sh
  • 在 Windows 上设置 vm.max_map_count 参数
  • 在ubuntu24上装ubuntu22
  • docker相关命令
  • Vue3实战三、Axios封装结合mock数据、Vite跨域及环境变量配置
  • Linux-CentOS-7—— 配置静态IP地址
  • PyTorch 笔记
  • Next.js + SQLite 项目 Docker 生产环境部署方案
  • 从数据到成果:R 语言在气象水文全流程中的关键技术应用
  • linux查看当前文件夹下面文件大小
  • 队列➕宽搜(BFS)算法的应用
  • Invalid bound statement (not found)
  • OceanBase V4.3.5 上线全文索引功能,让数据检索更高效
  • 【UE5 C++课程系列笔记】34——结构体与Json的相互转化
  • VBA第三十九期 VBA自动把工作表转换成PPT
  • CExercise_06_1指针和数组_1查找数组的最大值和最小值
  • 数据库——Redis
  • 河南通报部分未检疫生猪流入:立案查处,涉案猪肉被封存
  • 最高法:依法惩治损害民营企业合法权益的串通投标行为
  • 全总联合六部门印发工作指引,共保劳动者合法权益
  • 远洋渔船上的命案
  • 浙江理工大学传播系原系主任刘曦逝世,年仅44岁
  • 魔都眼|邮轮港国际帆船赛启动,120名中外选手展开角逐