声明:本文接着第十七文开始继续。
3.在windows上交叉编译liunx软件cmake环境配置
本文讲解的前提是你们的电脑上都已经装好了cmake和make软件了。
什么是交叉编译,笔者的理解就是在一个操作系统上,编译出运行在其他操作系统上运行的软件,这个过程就是交叉编译。
笔者目前的工作开发都是在windows上进行的,所以我们今天主要讲讲怎么在windows上配置cmake来编译出其他操作系统上运行的可执行文件。我们在上文已经讲过了编译就需要编译器,其实编译器也是一个可执行程序,那么在windows上编译就得有能够运行在windows上的编译器。这部分芯片提供者应该是要提供的。然后就是Cmakelists.txt的编写了。笔者为了测试,自己编写的CmakeLists.txt如下图:
以上是一个特别特别基础的CmakeLists.txt了。
cmake_minimum_required(VERSION 3.0.2)
表示改cmake项目要求的最低版本号要求
project(helloword C CXX RC)
建立一个名为hello的camke工程,这个工程支持c,c++,rc语言(我也不知道什么是rc语言,我在编译cmake的时候出现了这个错误,所以我在这里加了)
message(STATUS ${CMAKE_SYSTEM_NAME})
这个是我加的一个调试信息CMAKE_SYSTEM_NAME表示交叉编译的时候,目标操作系统的名称。也就是说配置你编译的可执行文件是运行在什么机子上面的。
set(${PROJECT_NAME}_PUBLIC_INCLUDES "")
这里定义了一个变量,${PROJECT_NAME}_PUBLIC_INCLUDES来放一些头文件引用路径。其中${PROJECT_NAME}就是来获PROJECT_NAME指向的内容,这个变量值其实就是helloword。
list(APPEND ${PROJECT_NAME}_PUBLIC_INCLUDES
"${CMAKE_CURRENT_SOURCE_DIR}/inc"
)这里相当于在原有${PROJECT_NAME}_PUBLIC_INCLUDES包含的路径的基础上,在加一个"${CMAKE_CURRENT_SOURCE_DIR}/inc"路径,其中CMAKE_CURRENT_SOURCE_DIR是指当前处理的cmakelist所在的路径。(这里注意下以后我们会讲到add_subdirectory,那这个命令会改变这个变量么?)
include_directories(${${PROJECT_NAME}_PUBLIC_INCLUDES})
这里是将头文件的包含目录告诉编译器。比如说有的时候我们.c文件中直接 #include “text.h”就行了,有的时候需要#include“test/inc/test.h”,写成什么样子,就得看你自己这个命令里传了什么样的路径给编译器。
include("./src/src.cmake")
就想.c可以包含.h,cmakelists.txt也能包含.cmake文件。这就可以把一个大的cmake项目分给各个模块了。我在总的cmake list里面包含各个模块的cmake就行了。
add_executable(sky "${${PROJECT_NAME}_SOURCES}")
这里是用后面包含的源文件生成一个名字为sky的可执行文件。
在这里我演示下在自己电脑上编译的效果:
我们来运行下sky.exe:
注意:写好cmakelist之后,可能在cmakelist文件夹下运行cmake.exe会报错,这个时候需要设置一些变量:CMAKE_MAKE_PROGRAM,CMAKE_CXX_COMPILER,CMAKE_C_COMPILER。目前笔者主要碰到这几个量没设值就会报错。因为我生成的就是windows程序。对应的cmake系统变量都会自动设置成windows自带的。当交叉编译其他系统上运行的可执行文件的时候,可能很多默认为windows下的量,就需要手动配置了。这个我下章节说下笔者编译linux可执行文件的时候需要设置的变量。
另外一些基本的cmake指令,我们先把这些基础的弄好之后,笔者之后会慢慢把笔者经常遇到的稍微讲讲。