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

相关推荐
LiQiang3343 分钟前
Ubuntu2404修改国内镜像
linux
杰哥技术分享44 分钟前
Ubuntu 22.04安装SQL Server指南
linux·运维·ubuntu·sqlserver
遇见火星44 分钟前
ubuntu18.04 升级Ubuntu 20.04
linux·运维·ubuntu·系统升级
x县豆瓣酱1 小时前
【第四节】ubuntu server安装docker
linux·ubuntu·docker
Gene_20221 小时前
【TOOL】ubuntu升级cmake版本
linux·运维·ubuntu
思序 LogicFlow1 小时前
关于在Linux上部署 SecretFlow --- P2P部署模式
linux·服务器
YC运维2 小时前
网络配置综合实验全攻略(对之前学习的总结)
linux·服务器·网络
平凡灵感码头3 小时前
什么是 Bootloader?怎么把它移植到 STM32 上?
linux·soc
无敌的牛4 小时前
Linux基础开发工具
linux·运维·服务器
Edingbrugh.南空4 小时前
实战指南:用pmap+gdb排查Linux进程内存问题
linux·运维·服务器