当前位置:首页 > 服务端 > windows下的C++工程如何移植到 linux 上

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)

windows下的C++工程如何移植到 linux 上 _ JavaClub全栈架构师技术笔记

 

 

 

以上转载于 :  makefile 编写

 

作者:楼主好菜啊
来源链接:https://www.cnblogs.com/ccut-ry/p/14680699.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/124665.html

标签: unused variable
分享给朋友:

“windows下的C++工程如何移植到 linux 上” 的相关文章