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应用
cmake使用除了应用程序外,就是编写CMakeLists.txt文档,以生成Makefile文件。
1. 每个目录下都需要文件CmakeLists.txt文件,CmakeLists.txt的编写需遵循cmake语法。
2. 最好在根目录下,创建build文件夹,让后进入build文件夹构建工程,这样构建工程的中间文件及最后文件都在build中,直接发布build文件即可。
3. 构建命令cd build; cmake ..; make;
注:cmake后的..是上层目录意思。
4. 生成可执行程序,运行即可。
#make verbose=1 开启 set(CMAKE_VERBOSE_MAKEFILE ON)
一个最简单示例
//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
5. cmake设置交叉编译
6. 交叉编译总结