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 测试程序

相关推荐
沉默的八哥2 小时前
Linux中LVM逻辑卷扩容
linux·运维·服务器
退役小学生呀2 小时前
十一、K8s细粒度权限管理RBAC
linux·docker·云原生·容器·kubernetes·k8s
网易独家音乐人Mike Zhou3 小时前
【Linux应用】开发板USB共享网络,网线或USB以太网共享网络(局域网连接PC和开发板,实现PC给开发板共享网络,USB通过NDIS驱动共享)
linux·网络·单片机·mcu·物联网·嵌入式·iot
basketball6164 小时前
Linux C 管道文件操作
linux·运维·c语言
浩浩测试一下5 小时前
Windows 与 Linux 内核安全及 Metasploit/LinEnum 在渗透测试中的综合应用
linux·运维·windows·web安全·网络安全·系统安全·安全架构
stark张宇5 小时前
Linux 文件创建、删除、移动、复制基础知识整理
linux·服务器·centos
Jiangnan_Cai6 小时前
Linux 系统 docker 部署 Dify
linux·docker·大模型·dify
Two_brushes.7 小时前
【linux网络】深入理解 TCP/UDP:从基础端口号到可靠传输机制全解析
linux·运维·服务器
FJW0208147 小时前
【Linux】系统引导修复
linux·运维·服务器
慌糖7 小时前
CentOS 安装 Redis 简明指南
linux·redis·centos