今天捡起去年年初写的AWS IOT C code进行一波维护。代码通过AWS IOT 和服务器进行交互,具有基本控制功能,这是在X86平台上。但在嵌入式平台上还多了部分跑rtmp码流部分的代码。为了方便的在不同平台上调试代码不用去手动修改其中的内容今天在MakeFile中添加了平台这个变量并传入C代码中。
而这种根据平台不同,需要调用不同编译器,依赖不同的lib,执行代码中不同部分的情况非常常见,所以需要有一套机制,仅通过make 下不同参数既能实现生成不同平台的代码的功能,这里写一个sample 以作记录。
先上测试C代码。
#include <stdio.h>
int main(int argc, char **argv) {
printf("All platform say hello!\n");
#if ARM
printf("ARM say hello say!\n");
#elif X86
printf("X86 say hello say!\n");
#endif
return 0;
}
使用gcc -D参数 定义宏 将我们需要区别的平台宏定义进去。实际的效果即为这样的。
gcc test.c -D X86 -o sample
All platform say hello!
X86 say hello say!
gcc test.c -D ARM -o sample
All platform say hello!
ARM say hello say!
而上诉需要实现不同平台采用不同编译链,不同平台的lib。执行代码中的不同部分。所以会把这部分内容放在Makefile中。
下面上一个简略的MakeFile进行说明,如果更加不同平台来实现依赖不同lib 执行不同编译工具 跑不同位置的代码的:
PLATFORM?=ARM
APP_DIR = .
APP_INCLUDE_DIRS += -I $(APP_DIR)
APP_NAME = test
APP_SRC_FILES = $(APP_NAME).c
LIB_DIR = $(APP_DIR)/lib
LIB = -L$(LIB_DIR)/$(PLATFORM) #不同平台找不同lib
ifeq ("$(PLATFORM)","X86") #不同平台编译器 引用不同的lib
CC = gcc
LIB += -lsioclient
endif
ifeq ("$(PLATFORM)","ARM")
CC=/home/xx.xx/work/toolchain-arm_cortex-a7+vfp_gcc-4.8-linaro_glibc-2.19_eabi/bin/arm-openwrt-linux-gcc
LIB += -lrtmp
endif
INCLUDE_ALL_DIRS += $(APP_INCLUDE_DIRS)
SRC_FILES += $(APP_SRC_FILES)
COMPILER_FLAGS += -g
MAKE_CMD = $(CC) $(SRC_FILES) $(COMPILER_FLAGS) -D $(PLATFORM) -o $(APP_NAME) $(LIB) $(INCLUDE_ALL_DIRS)
all:
$(MAKE_CMD)
clean:
rm -f $(APP_DIR)/$(APP_NAME)
我们执行make PLATFORM=ARM
就会执行下面的编译语句:
/home/xx.xx/work/toolchain-arm_cortex-a7+vfp_gcc-4.8-linaro_glibc-2.19_eabi/bin/arm-openwrt-linux-gcc
test.c -g -D ARM -o test -L./lib/ARM -lrtmp -I .
传入test.c 的参数即为ARM,且依赖不同的lib
make PLATFORM=X86
就会执行下面的编译语句:
gcc test.c -g -D X86 -o test -L./lib/X86 -lsioclient -I .
传入test.c的参数即为X86,且依赖不同的lib