海思3559万能平台搭建:C/C++混编

前言

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

猜你喜欢

转载自blog.csdn.net/qq_42330920/article/details/127068553