Linux C 程序 【01】最小程序

1.开发背景

基于 RK3568 平台的基础上,编译一个在系统上运行的最小程序。

2.开发需求

由于 RK3568 作为宿主机,在上面编译程序比较慢,所以还是采用在 Ubuntu 下交叉编译后再拷贝到宿主机上运行。

设计实验:

1)搭建 Makefile

2)创建一个最小运行程序

3.开发环境

ubuntu20.04 + RK3568 + Linux4.19.232

4.实现步骤

4.1 创建 Makefile

Makefile 的创建和使用参考 Makefile 篇章

bash 复制代码
# 定义目标文件名
TARGET := app_test

# 关键路径 ##############################################
INC_DIR = ./inc
INC_DIR_COM = ../../00_com/inc
SRC_DIR = . ./src ${SRC_DIR_COM}
SRC_DIR_COM = ../../00_com/src
OBJ_DIR = ./obj
TAR_DIR = ./install

# 定义编译器和编译选项 ###################################
CC := aarch64-linux-gnu-gcc
CFLAGS := 
# CFLAGS += -fPIC # 生成动态库
# CFLAGS += -O2 # 优化等级
CFLAGS += -Wall # 显示警告
CFLAGS += -Werror # 显示错误
CFLAGS += -I${INC_DIR} # 添加.h路径
CFLAGS += -I${INC_DIR_COM} # 添加.h路径
CFLAGS += -lpthread # 多线程编译
# CFLAGS += -DNDEBUG # 关闭断言

# 定义源文件和目标文件 srcs:*.c 遍历添加
SRCS := $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))
SRCS_FILE = $(notdir $(SRCS))	# 去除路径,剩下文件名

OBJS := $(SRCS:.c=.o)
# OBJS := $(patsubst %.c, $(OBJ_DIR)/%.o, $(SRCS_FILE))
MMDS := $(OBJS:.o=.d)

# IP 地址 和 路径
IP_ADDRESS := 172.16.0.146
IP_PATH := /home/reetoo/

# 默认目标 $< 表示第一个依赖 $@ 目标文件
app: $(TARGET)
# -MMD 生成 *.d 文件 记录 .o 文件对 .c 和 .h 文件的依赖 
-include ${MMDS} # -include 带 - 前缀第一次编译不会出错
%.o: %.c  
# $(OBJ_DIR)/%.o: %.c 
	$(CC) $(CFLAGS) $< -c -MMD -o $@	

# 生成可执行文件
$(TARGET): $(OBJS) 
	$(CC) $(CFLAGS) $^ -o $@
#	mv ${OBJS} ${OBJ_DIR}
#	mv ${MMDS} ${OBJ_DIR}

# if 判断需要顶格编写 如果不存在路径则创建
ifeq ($(wildcard ${TAR_DIR}), )
	mkdir ${TAR_DIR}
endif
	mv ${TARGET} ${TAR_DIR}/${TARGET}

# 清理生成的文件
clean:
	rm -f $(OBJS) ${MMDS} $(TARGET) ${OBJ_DIR}/*
ifneq ($(wildcard ${TAR_DIR}/*), )
	rm ${TAR_DIR}/*
endif

prebuild:
# if 判断需要顶格编写 如果不存在路径则创建
ifeq ($(wildcard ${OBJ_DIR}), )
	mkdir ${OBJ_DIR}
endif
#	-cp ${INC_DIR_COM}/*.h ${INC_DIR}
#	-cp ${SRC_DIR_COM}/*.c ${SRC_DIR}

all:
	make prebuild
	make 
	make scp

rebuild:
	make clean
	make 

# 打包文件
pack:
	make clean

# 发送文件  需要先手动连接一次
scp:
	sshpass -p reetoo scp ${TAR_DIR}/${TARGET} reetoo@${IP_ADDRESS}:${IP_PATH} 

test:
	$(warning $(SRC_DIR))
	$(warning $(SRCS))
	$(warning $(SRCS_FILE))
	$(warning $(OBJS))
	$(warning $(OBJ_DIR)/%.o)

4.2 创建源码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    printf("Hello World!\n");

    return 0;
}

本章的测试源代码很简单,不涉及功能

4.3 编译代码

bash 复制代码
make all

编译代码后自动发送到目标机,这样就可以直接测试程序了

4.4 测试程序

相关推荐
HLC++8 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室9 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy12 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕12 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫13 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生14 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1115 小时前
linux基础IO
linux·运维·服务器
BelongPanda17 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯17 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983417 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器