海思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感觉嵌套的太冗余了,正常开发一个片子用不到呐
264 0
|
C++
C/C++混编“未定义的引用”的解决一例
C/C++混编“未定义的引用”的解决一例
225 0
|
C++
oc/c/c++混编老文,写的很好,mark
http://blog.csdn.net/gf771115/article/details/9664393
724 0
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5