什么是交叉编译:

交叉编译是指在一种环境(操作系统+芯片指令)中编译另外一种环境的程序。

名词定义:

  1. host:执行编译操作的环境
  2. target:最终运行编译结果的环境

有些什么特殊的地方:

  1. 编译器一定是host中的程序,但是编译器输出的程序却是是target中运行的。
  2. host上面不存在target中编译或者运行需要的头文件和库。

要做的事情:

  1. 需要一种能够在host上执行,然后把c/c++代码编程target上面运行的二进制执行文件的编译器。
  1. 通过cmake的CMAKE_C_COMPILER和CMAKE_CXX_COMPILER可以设置编译器。
  2. 每个target环境需要提供我们需要的编译工具。工具里面一般分为host和target两个目录。注意编译器一定要到host里面去找。
  3. 并且有的编译器其实是很多编译器的集合。比如CUDA的编译器nvcc在运行的时候还需要提供c++的编译器的路径。这个可以通过CMAKE_CUDA_HOST_COMPILER来设置。
  1. 设置能够找到target中的库和头文件的地址
  1. 可以通过cmake的CMAKE_FIND_ROOT_PATH设置这个目录。
  2. 也有的编译器要求设置特殊的环境变量来制定查找的目录,这个更具编译工具的文档来确定。
  1. 上面说的这些操作就是所谓的toolchain。有的编译工具会提供一个toolchain的脚本,你只需把这个脚本的地址告诉cmake就行了。使用CMAKE_TOOLCHAIN_FILE来设置。不过现在应该对toolchain也没有太多神秘感了。