首页 > 编程语言 >C++_交叉编译和pybind11

C++_交叉编译和pybind11

时间:2024-05-16 17:43:03浏览次数:14  
标签:gcc CMAKE 交叉 C++ 编译 pybind11 linux

编译

本地编译 和交叉编译

本地编译

当前平台编译

交叉编译

交叉编译是指在一个平台上编译另一个平台上运行的代码。在C++中,交叉编译通常涉及以下步骤:
    安装交叉编译工具链。   
    配置编译环境。   
    使用工具链编译代码。

首先,确保安装了交叉编译工具链,例如gcc-arm-linux-gnueabihf	 
    交叉编译链 toolchain
       方式一:下载已经做好的交叉编译链	
       方式二:使用工具定制交叉编译链	

Cmake交叉编译

 如果你使用的是 cmake 工具来进行编译,那么你需要指定如下内容:
  CMAKE_SYSTEM_NAME      目标系统:Linux   
  CMAKE_SYSTEM_PROCESSOR   目标架构:arm64  aarch64  X86_64               
  CMAKE_C_COMPILER         gcc编译器:arm-linux-gnueabihf-gcc       
  CMAKE_CXX_COMPILER       g++编译器:arm-linux-gnueabihf-g++  
  CMAKE_FIND_ROOT_PATH  :可以用于find_package,find_library和find_path。且只能是lib目录上层的目录	

## 对应交叉编译环境来说,一般通常会设置 CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 为ONLY:
 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

###说明
   在Linux平台上,一般都是采用aarch64命名,比如说Android。而在Apple平台,则一般使用arm64命名
    x86_64是基于冯诺依曼体系架构的  AArch64是一种ARMv8架构,也是一种计算机的体系架构
       aarch64-linux-gnu-gcc 是一个交叉编译工具链,可以在其他架构的系统中,编译安装 64 位 arm 架构的程序。
	      常用在嵌入式代码的移植中。aarch64-linux-gnu-gcc 是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具。可用于交叉编译 ARMv8 64 位目标中的裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。aarch64-linux-gnu-gcc 交叉编译器必须安装在 64 位主机上,才能编译目标代码
       arm-linux-gnueabihf-gcc 是一款用于编译 ARM 架构的 C 语言编译器
	
    ABI:二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)
    EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约
    ,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)
	
   –sysroot的说明可以看出,其会对编译和链接过程中,查找头文件和链接库造成影响。

     例如:
     原本默认会从/usr/include目录中搜索头文件、从/usr/lib中搜索依赖库,
     当设置了–sysroot=dir 后则会从dir/usr/include搜索头文件、从dir/usr/lib中搜索依赖库。

pybind

Python 调用 C++ 的 库基本上有两种方法:
    一是使用 PyBind11 C++ 库生成 Python 模块,使用 Pybind11能够直接对c++代码进行导出,并且支持c++的许多数据类型如vector的自动转换
	二使用 cytpes Python 包访问已编译的共享库。
   		使用cytpes还需要额外对c++代码进行处理 


 pybind11 库中的CMakeLists.txt是针对tests目录下的例子编写的,
   运行上面的命令将编译和执行这些例子。因此这只是测试你的环境是否可以正常的编译和运行,至少应该保证能够编译通过
   
pybind11的三种方式:
       1)使用pip安装 
       pip install pybind11 -i https://pypi.tuna.tsinghua.edu.cn/simple/
	   
	   2)apt-get安装
	     sudo apt-get install python-pybind11
       3)源码编译(推荐这种,方便后续CmakeLists.txt中使用find_package(pybind11 REQUIRED))
        cmake ..
		make -j4
        make install
   
        安装后的可以使用 后续CmakeLists.txt中使用 find_package(pybind11 REQUIRED)

使用pybind

1.把c++编译成可供python调用的库 
   编译好的pybind11文件夹拷贝到了c++工程目录下 或者软链接到工程目录下 ln -s ./pybind /opt/pybind11-master

  源文件和cmakelists.txt文件
   01.需要注意CMakeLists.txt如果需要指定python版本,要放在pybind11之前,否则,有时候还是会直接连接到系统自带的python版本。	
       add_subdirectory 命令,可以将指定的文件夹加到build任务列表中
	   add_subdirectory(pybind11)
	   pybind11_add_module(Pypcc ${PROJECT_SOURCE_DIR}/src/pcc.cpp ${dso_SOURCE_FILES})
       ###等价于 c++的add_executable命令,

  02.源码中    
    #include <pybind11/pybind11.h>
  	   
  03.(进入到新建的build文件夹,执行cmake .. 再执行make)
       ,需要注意的是, linux 系统在使用 CMake 编译 c++ 动态链接库的时候,
	     会加一个前缀lib, 生成libmap_interface.so, 因此,这三个地方的命名应该修改如下:
2.python中使用
  import Pypcc #导入.so模块
  Pypcc.XXX() #调用模块的函数

参考

 https://blog.csdn.net/weixin_43376501/article/details/129786275
  aarch64-linux-gnu-gcc 14.1.0-1 https://archlinux.org/packages/extra/x86_64/aarch64-linux-gnu-gcc/

标签:gcc,CMAKE,交叉,C++,编译,pybind11,linux
From: https://www.cnblogs.com/ytwang/p/18196381

相关文章

  • C++模板编程-enable_if
    std::enable_if的使用对于重载的函数或者函数模板的选择上,编译器内部有一个自己的规则,并不是简单粗暴的对函数就优先选择,对函数模板就靠后选择替换失败并不是一个错误(SFINAE):SubstitutionFailureIsNotAnError,SFINAE看成是C++语言的一种特性或者说一种模板设计中要遵循的......
  • 开源流媒体服务器ZLMediaKit在Windows上编译过程详解(附编译后版本下载)
    场景开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130136245以上讲了ZLMediaKit的具体使用场景,文章中使用的windows的版本不是最新版,比如在flv播放时,旧......
  • linux内核Makefile和busybox编译
    刚开始学习Linux时的一些记录linux内核配置体验在arch/arm/configs/目录下面找到相似的配置文件,其名称一般为xxx_defconfigmakexxx_defconfigmakemenuconfig配置你的内核,配置完成后生成.config文件在TOPDIR,该文件由于是以‘.’开头,故在linux下是一个隐藏的文件。生成......
  • flutter开发项目编译失败依赖冲突的解决方法dependency_overrides
    1.问题在复杂的稍等大点的flutter项目当中,依赖各种第三方框架是很正常,而且也有有很多依赖的,但有时难免存在不同的框架刚好使用了同一个依赖库的不同版本,特别是依赖了系统的某个库的不同版本这个时候就难免会出现同一个依赖库不同版本冲突的编译失败问题2.现象Becauseflut......
  • 深度解读《深度探索C++对象模型》之C++虚函数实现分析(三)
    “深度解读《深度探索C++对象模型》”系列已经在CSDN上和我的公众号上更新完毕,请有需要的同学移步到我的CSDN主页里去阅读,主页地址:https://blog.csdn.net/iShare_Carlos?spm=1010.2135.3001.5421或者敬请关注我的公众号:iShare爱分享前面两篇请从这里阅读:深度解读《深度探索C+......
  • 《Effective C++》第三版-5. 实现(Implementations)
    目录条款26:尽可能延后变量定义式的出现时间(Postponevariabledefinitionsaslongaspossible)条款27:尽量少做转型动作(Minimizecasting)条款28:避免返回handles指向对象内部成分(Avoidreturning“handles”toobjectinternals)条款29:为“异常安全”而努力是值得的(Striveforexc......
  • Android源码编译报错 FAILED: out/soong/build.ninja
    网上查了比较多资料发现是swap分区不够导致的,修改swap分区大小参考如下:https://blog.csdn.net/phj1990/article/details/124961180https://zhuanlan.zhihu.com/p/399986218swap分区大小选择:内存<=4g:Swap至少4G内存4~16G:Swap至少8G内存16G~64G:Swap至少16G内存64......
  • C++:自定义异常
    #include<iostream>#include<stdexcept>//自定义异常类classMyException:publicstd::exception{public://重写what()函数以提供异常的描述,const表示函数不会改变类的成员变量,noexcept表示不会抛出异常constchar*what()constnoexceptoverride{......
  • C++ 对象池
    对象池概念对象池模式(ObjectPoolPattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利用已有的对象来处理请求,减少频繁创建对象所占用的内存空间和初始化时间。对象池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非......
  • C++基础篇
    输入输出流iostream向流写入数据<<运算符<<运算符接受两个运算对象,此运算符将给定的值写到给定的ostream对象中:左侧:运算对象为ostream对象,如cout、cerr、clog右侧:运算对象是要打印的值输出结果:写入给定值的那个ostream对象,即此运算符返回其左侧的运算对象。表达式等价于:(std......