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

简介: 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之类的话需要加强制转换


相关文章
|
Linux 开发工具 C语言
hi3559 C/C++混编 makefile(基于官方sample)
由于个人需要想做海思的C++和C混编,好像不认真学一学makefile不行了 本人博客,csdn搬运 main函数是卸载cpp里面的,写在c里面的就是给你们提供一个思路了 弄明白了有空自己写呐,海思的makefile感觉嵌套的太冗余了,正常开发一个片子用不到呐
251 0
|
C++
C/C++混编“未定义的引用”的解决一例
C/C++混编“未定义的引用”的解决一例
218 0
|
C++
oc/c/c++混编老文,写的很好,mark
http://blog.csdn.net/gf771115/article/details/9664393
720 0
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4