自动make工具--CMake

Posted yuxi_o

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动make工具--CMake相关的知识,希望对你有一定的参考价值。

cmake官网:https://cmake.org/      CMake Tutorial   https://gitlab.kitware.com/cmake/community/-/wikis/home

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。

cmake应用

cmake使用除了应用程序外,就是编写CMakeLists.txt文档,以生成Makefile文件。

1. 每个目录下都需要文件CmakeLists.txt文件,CmakeLists.txt的编写需遵循cmake语法。

2. 最好在根目录下,创建build文件夹,让后进入build文件夹构建工程,这样构建工程的中间文件及最后文件都在build中,直接发布build文件即可。

3. 构建命令cd build; cmake ..; make;

注:cmake后的..是上层目录意思。

4. 生成可执行程序,运行即可。

一个最简单示例

//hello.c
#include <stdio.h>
int main()
{
    printf("Hello World!\\n");
    return 0;
}

//CmakeLists.txt
PROJECT(HELLO)
SET(SRC_LIST hello.c)
ADD_EXECUTABLE(hello ${SRC_LIST})

流程:

~$pwd
/home/yuxi/test/cmake/build
~$ls ..
build  CMakeLists.txt  hello.c
~$cmake ..
-- The C compiler identification is GNU

-- The CXX compiler identification is GNU

-- Check for working C compiler: /usr/bin/gcc

-- Check for working C compiler: /usr/bin/gcc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working CXX compiler: /usr/bin/c++

-- Check for working CXX compiler: /usr/bin/c++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Configuring done

-- Generating done

-- Build files have been written to: /home/yuxi/test/cmake/build

~$ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile
~$make
Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/hello.c.o
Linking C executable hello
[100%] Built target hello
~$ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  hello  Makefile
~$./hello
Hello World!
~$ls CMakeFiles/
CMakeCCompiler.cmake               CMakeOutput.log    Makefile2
cmake.check_cache                  CMakeSystem.cmake  Makefile.cmake
CMakeCXXCompiler.cmake             CMakeTmp           progress.marks
CMakeDetermineCompilerABI_C.bin    CompilerIdC        TargetDirectories.txt
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    hello.dir

Cmake debug和release设置

1. 通过命令行指定

cmake -DCMAKE_BUILD_TYPE=Release/Debug ..

2. 在CMakeLists.txt中设置(目前不起作用)

SET(CMAKE_BUILD_TYPE "Debug”)
or
SET(CMAKE_BUILD_TYPE "Release")

同时可在CMakeLists.txt中设置release和debug编译选项

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

交叉编译示例 

交叉编译Makefile:CrossCompile.cmake

SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR "armv7-a")

SET(CMAKE_SYSROOT "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi")
#SET(CMAKE_SYSROOT "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots")

SET(TARGETSYSROOT "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi")
SET(TOOLCHAIN_PATH "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux")

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 -rdynamic")
SET(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc")

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 -rdynamic")
SET(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++")

SET(CMAKER_AR "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar")
SET(CMAKER_LINKER "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ld")
SET(CMAKER_NM "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-nm")
SET(CMAKER_OBJDUMP "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-objdump")
SET(CMAKER_RANLIB "${TOOLCHAIN_PATH}/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ranlib")

#SET(OPENSSL_LIBRARIES ${TARGETSYSROOT}/usr/lib)
#SET(OPENSSL_INCLUDE_DIR ${TARGETSYSROOT}/usr/include/openssl)

#SET(CMAKE_FIND_ROOT_PATH 
#    ${TOOLCHAIN_PATH}
#    ${TOOLCHAIN_PATH}/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0
#    ${TOOLCHAIN_PATH}/usr/lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/plugin/include
#    ${TARGETSYSROOT}/lib 
#    ${TARGETSYSROOT}/usr/lib/arm-poky-linux-gnueabi/5.3.0
#    ${TARGETSYSROOT}/usr/lib
#    ${TARGETSYSROOT}/usr/include)

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)

cmake命令

cmake -DCMAKE_TOOLCHAIN_FILE=${TOPDIR}/${BASEDIR}/CrossCompile.cmake \\
        -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX=${TOPDIR}/winstall ..

 

参考:

1. cmake快速入门

2. CMake快速使用教程

3. https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html

4. 使用 cmake 进行交叉编译

5. cmake设置交叉编译

6. 交叉编译总结

以上是关于自动make工具--CMake的主要内容,如果未能解决你的问题,请参考以下文章

比较Make和CMake

初见 cmake

项目构建工具CMake、GYP、GN

CMake学习之路

CMake使用教程

GNU开发工具——CMake快速入门