cmake自动选择编译器脚本

2,102 阅读1分钟

一、什么是cmake

CMake 是一个跨平台的,开源的构建系统(BuildSystem)。CMake 可以通过 CMakeLists.txt 文件来产生特定平台的标准的构建文件,例如:为 Unix 平台生成makefiles文件(使用GCC编译),为 Windows MSVC 生成 projects/workspaces(使用VS IDE编译)或Makefile文件(使用nmake编译)。 关键一点是跨平台,并且在Linux平台最终生成makefile来进行编译。

二、常用知识点

1、静态库链接 target_link_libraries(dlib_demo libdlib.a)

2、动态库链接 target_link_libraries(dlib_demo dlib)

3、开启动态库编译 cmake .. -DBUILD_SHARED_LIBS=ON

cmake .. :注意命令后面的点号,代表本目录的上一级目录。

执行【cmake ..】之后,系统自动生成了:CMakeFiles, CMakeCache.txt, cmake_install.cmake 等文件,并且生成了Makefile。不用太关注这些文件的意义,重点是它自动生成了Makefile。

4、cmake设置变量 set(SRC_CPP dlib_face_recognition.cpp)

追加变量值 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")

5、cmake打印变量值 message("src cpp = ${SRC_CPP}")

三、实现cmake选择编译

执行命令cmake .. -DHISI=1或者-DHISI=ON进行海思编译器编译demo。 demo如下:

cmake_minimum_required(VERSION 2.8.12)
project(eignface_demo)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lstdc++ -lm")
set(OPENCV_LIB opencv_highgui opencv_objdetect opencv_core opencv_imgproc opencv_contrib)
set(SRC_CPP EigenFace.cpp)

if (HISI)
    set(TOOLCHAIN_DIR "/opt/hisi-linux-nptl/arm-hisiv100-linux/target")
    set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
    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_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-hisiv100nptl-linux-g++)
    set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-hisiv100nptl-linux-gcc)
    include_directories(./hisi_opencv/include/)
    link_directories(./hisi_opencv/lib/)
    message("-- Use hisi compile demo")
    add_executable(eignface_hisi  ${SRC_CPP})
    target_link_libraries(eignface_hisi ${OPENCV_LIB})
else()
    set(CMAKE_C_COMPILER "/usr/bin/gcc")
    include_directories(./gcc_opencv/include/)
    link_directories(./gcc_opencv/lib/)
    message("-- Use gcc compile demo")
    add_executable(eignface_gcc  ${SRC_CPP})
    target_link_libraries(eignface_gcc ${OPENCV_LIB})
endif()

参考资料:

CMake---基础练习1 - WP的烂笔头 - 博客园 www.cnblogs.com/carle-09/p/…

Cmake链接静态库(一) - ox0080的博客 blog.csdn.net/ox0080/arti…

Cmake 设置交叉编译环境_Linux编程_Linux公社-Linux系统门户网站 www.linuxidc.com/Linux/2014-…