前言
应用的开发有时候用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之类的话需要加强制转换