windows下的C++工程如何移植到 linux 上

CROSS_COMPILE = aarch64-himix100-linux_V630-
CC = $(CROSS_COMPILE)gcc
CPLUS = $(CROSS_COMPILE)g++
 
INC_DIR = -I./alg_test/inc
CFLAGS = -Wall $(INC_DIR) -O2 -g -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable 
CFLAGS += -mcpu=cortex-a73.cortex-a53 -fno-aggressive-loop-optimizations -lstdc++ -ldl -ffunction-sections -fdata-sections -ftree-vectorize 
 
 
SOURCES = $(wildcard ./alg_test/src/*.c)
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))
SOURCES_CPP = $(wildcard ./alg_test/src/*.cpp)
OBJECTS_CPP = $(patsubst %.cpp, %.o, $(SOURCES_CPP))
 
TARGET = arm_alg
 
all : $(TARGET)
 
%.o:%.cpp  
	$(CPLUS) $(CFLAGS) -c -o $@ $<
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<
 
 
$(TARGET): $(OBJECTS) $(OBJECTS_CPP)
 
	$(CC) $(CFLAGS) -o $@ $(OBJECTS) $(OBJECTS_CPP) -lpthread -lm 
	chmod -R 777 $(TARGET)
	rm -f *.o
	mv arm_alg ./bin
 
clean:
 
	rm -rf $@.
	rm ./*.o $(TARGER) $(OBJECTS) $(OBJECTS_CPP) -f

 

直接可能看的不大明白因为里面用到的参数是比较多的下面具体分析。

该makefile文件是让交叉编译工具去编译一个程序,等好的左边都是定义的变量,如CROSS_COMPILE等等,$后面相当于当做参数传递,前三行相当于把编译工具确定,如果是c文件就在后面加上gcc,如果是cpp文件就在后面加上g++,然后和前面的交叉编译前缀连在一起构成完整的交叉编译工具名称。

其后三行INC_DIR与CFLAGS是负责确定编译的配置参数,后面是放在编译工具之后,可以理解为放在gcc之后的参数,这里是放在交叉编译工具之后

-I(大写的i)加上路径表示头文件路径,告诉编译器到这里寻找头文件

-Wall表示编译之后显示所有警告

-O2表示编译优化等级为2级,0-3可选择

-g表示可执行程序包含调试信息

-Wunused-but-set-variable
每当一个局部变量被分配时发出警告,此警告由启用-Wall 。
-Wunused-function
每当声明静态函数但未定义或未使用非内联静态函数时发出警告。此警告由启用-Wall 

-mpcu=type表示处理器类型,这里是交叉编译所以要明确,如果不需要交叉编译可省略

-fno-aggressive-loop-optimizations表示无需优化的循环结构

-l(小写的l)加上动态库,如-lm 链接数学库, -lptread 链接线程库,当然也可以链接自己编译的库,不过需要放到指定寻找的路径下

再其后的四行时批量操作c文件生成o文件 这里就体现出makefile的方便之处

这里用到了makefile中的两个函数wildcard和patsubst

wildcard表示扩展通配符,patsubst表示将路径中所有的c文件以列表形式转换为o文件

SOURCES = $(wildcard ./alg_test/src/*.c)
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))

以上两句就是说将当前文件夹下的c文件以绝对路径保存到sources中,接着将该路径传递到下句所有的c文件生成o文件,但这里并不是真正生成了o文件,而是生成列表,就是说生成一种对应关系,比如a.c对应a.o,b.c对应b.o

以上是所有的准备工作,下面才是具体的指令部分

Target表示最终生成可执行文件,叫做arm_alg

all:表示执行make指令后从该句执行

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

这两句是生成o文件的指令,%.o和%.c则是上述通配符函数生成的自动对应列表,$@表示目标文件,$<表示依赖文件

以上是一个完整的makefile文件的分析,下面自己动手写一个简单的程序测试一下

新建一个testmakefile,在该文件夹下新建alg文件夹,bin文件夹,makefile文件,alg下新建src,inc两个文件夹,在src中建立a.cpp,b.cp和main.cpp,inc中建立a.h和b.h,两个cpp子文件中分别写函数func1和func2用来打印输出

最后的makefile如下所示,由于程序相当的简单,根本用不到严格的参数配置,我们就简单的添加几个表示一下

CROSS_COMPILER=g
CC=$(CROSS_COMPILER)cc
CXX=$(CROSS_COMPILER)++
 
INC_DIR=-I ./alg/inc
 
CFLAGS=-Wall $(INC_DIR) -O1 -g 
 
SOURCES_C=$(wildcard ./alg/src/*.c)
OBJECTS_C=$(patsubst %.c,%.o,$(SOURCES_C))
SOURCES_CPP=$(wildcard ./alg/src/*.cpp)
OBJECTS_CPP=$(patsubst %.cpp,%.o,$(SOURCES_CPP))
 
%.o:%.c
	$(CC) $(CFLAGS) -c -o $@ $<
%.o:%.cpp
	$(CXX) $(CFLAGS) -c -o $@ $<
 
Target=test_alg
 
all:$(Target)
 
$(Target): $(OBJECTS) $(OBJECTS_CPP)
	$(CXX) $(CFLAGS) -o $@ $(OBJECTS_C) $(OBJECTS_CPP)
	chmod -R 777 $(Target)
	mv test_alg ./bin
 
clean:
	rm ./bin/test_alg $(TARGER) $(OBJECTS) $(OBJECTS_CPP)

 

 

 

以上转载于 :  makefile 编写

 

posted @ 2021-04-20 13:46  楼主好菜啊  阅读(815)  评论(0编辑  收藏  举报