前言
应用的开发有时候用C++就是比C更方便,更直接,海思的开发环境是集成了C++的环境的,kernel也默认编进去了C++的库,我们想在原先sample的基础上,用C++和C混编,其实只需要修改Makefile和代码里关于参数检查的相关部分(看该部分需不需要用C编,如果在函数内部调用externC是没用的)
Makefile
比如我们想把sample下venc的代码改成C++,在sample路径下venc部分的Makefile中
添加CXX=aarch64-himix100-linux-g++
CXXFLAGS=$(CFLAGS)
为了方便其他C++文件也添加进来,就像博主的文件夹,喜欢吧每个功能单独拎出来作为一个C文件,主函数所在的文件用C++编写,为了某个功能也需要C++写的时候也能方便添加,做出批量修改
SRC_PATH1=./ DIRS1=$(shell find $(SRC_PATH1) -maxdepth 0 -type d) SRCS_cpp += $(foreach dir, $(DIRS1), $(wildcard $(dir)/*.cpp)) SRCS_c += $(foreach dir, $(DIRS1), $(wildcard $(dir)/*.c)) SRCS_c += $(wildcard *.c) SRCS_cpp += $(wildcard *.cpp) $(info, $(SRCS_c) ) $(info, $(SRCS_cpp) ) OBJS_cpp := $(patsubst %.cpp, %.o, $(SRCS_cpp)) OBJS_c := $(patsubst %.c, %.o, $(SRCS_c))
将上一级的linux.mak中的相关部分剪切过来并修改
.PHONY : clean all all: $(TARGET) $(TARGET):$(COMM_OBJ) $(OBJS_c)$(OBJS_cpp) @$(CXX) $(CXXFLAGS) $(LIBS_LD_CFLAGS) -lpthread -lm -o $@ $^ -Wl,--start-group $(MPI_LIBS) $(SENSOR_LIBS) $(AUDIO_LIBA) $(REL_LIB)/libsecurec.a -Wl,--end-group clean: @rm -f $(TARGET) @rm -f $(OBJS_c) @rm -f $(OBJS_cpp) @rm -f $(COMM_OBJ) cleanstream: @rm -f *.h264 @rm -f *.h265 @rm -f *.jpg @rm -f *.mjp @rm -f *.mp4
代码修改
将之前用C写好的功能函数包含在头文件内,externC 的时候只包含头文件就可以了,C++的库放在后面
#ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* End of #ifdef __cplusplus */ #include "platform.h" } #include <bits/stdc++.h>//包含了大量C++头文件不需要再一个个查找,缺点是编译会变慢 #include <queue> using namespace std; queue<VIDEO_FRAME_INFO_S> q_stVideoFrame_process; queue<VIDEO_FRAME_INFO_S> q_stVideoFrame_process_osd; /* *描述 :线程用于测试C++ *参数 :arg 为自定义结构video_process_s,VPSS_GRP和VPSS_CHN用于传参给HI_MPI_VPSS_GetChnFrame *返回值:无 *注意 :HI_MPI_VPSS_GetChnFrame完必须释放,否则再次获取VB会报错 VIDEO_FRAME_INFO_S里的虚拟地址不可以直接使用,必须通过物理地址HI_MPI_SYS_Mmap映射后才可以作为数据存放地址用 用完同样需要HI_MPI_SYS_Munmap解映射 */ HI_VOID *frame_check_task(HI_VOID *arg) { cpu_set_t mask;//cpu核的集合 cpu_set_t get;//获取在集合中的cpu int num = sysconf(_SC_NPROCESSORS_CONF); printf("frame_check_task:system has %d processor(s)\n", num); CPU_ZERO(&mask);//置空 CPU_SET(0, &mask);//设置亲和力值 if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)//设置线程CPU亲和力 { fprintf(stderr, "set thread affinity failed\n"); } if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0)//获取线程CPU亲和力 { fprintf(stderr, "get thread affinity failed\n"); } HI_S32 s32Ret; queue<int> q; for(int i = 0; i < 5; i++){ q.push(i); } cout<<q.front()<<' '<<q.back(); return NULL; }
如果可以编译通过,就说明环境配置没有问题了
不能通过的时候根据报错看看是cpp文件没有编译进来,还是因为C++更严格的类型检查,比如枚举类型,bool类型,我们如果是直接返回int之类的话需要加强制转换