CMakeList.txt学习

1.CMake包括两个过程:configure和generate。configure的过程就是从输入创建内部表示,generate的过程是生成工程文件过程。
2.cmake需要cache文件的原因是每次build的时候,如果有external project,那么无需再次给定环境变量,对于一个项目有多个CMakeLists.txt文件来说比较方便。
3.configure的具体过程就是:如果存在CMakeCache.txt则首先读取CMakeCache.txt,否则读取CMakeLists.txt,由cmake的语言解释器解释它,遇到了像include,add_subdirectory命令等,会有command pattern object来执行,并递归解释子目录下的CMakeLists.txt,当所有CMakeLists.txt都解释完后会得到一个CMakeCache.txt文件。参考:http://www.aosabook.org/en/cmake.html
- PROJECT()
可以生成native编译配置文件,在linux/unix平台,生成makefile,在mac平台可以生成xcode,在windows平台可以生成msvc工程的配置文件

  • PROJECT(projectname [CXX] [C] [JAVA])
    这个执行是用来定义工程的名称的和定义工程支持的语言。这个指令也隐式的定义了两个cmake变量:_BINARY_DIR以及_SOURCE_DIR,这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。
  • 在工程目录下添加COPYRIGHT、README、和run.sh,重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:
    INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
    INSTALL(PROGRAMS run.sh DESTINATION bin) INSTALL(PROGRAMS bin/hello
    DESTINATION bin) INSTALL(DIRECTORY doc/ DESTINATION
    share/doc/cmake_demo) 这些命令表示在执行make
    install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中,cmake执行命令如下: cmake
    -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..这时将工程目录安装到~/data/cmake_demo目录下.

  • SET指令的语法:
    SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    Set指令是用来显式的定义变量的,我们之前用到的是SET(SRC_LIST
    main.cpp)如果有多个源文件,也可以定义成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。
    MESSAGE指令的语法是:

  • MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”
    …)
    这个指令用于向终端输出用户信息,包含三种类型:
    SEND_ERROR,产生错误,生成过程被跳过。
    SATUS,输出前缀为-的信息。
    FATAL_ERROR,立即终止所有cmake过程。

  • ADD_EXECUTABLE(hello ${SRC_LIST})
    定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表,本例中你可以直接写成ADD_EXECUTABLE(hello
    main.c)。

用Cmake修改VS

1.假如我要让VS只能编译Release版本的程序,那么可以通过set( CMAKE_CONFIGURATION_TYPES “Release” CACHE STRING “Release” FORCE) 实现。
2.如果要自己定义一个查找库的方法,需要定义一个.cmake文件,然后在CMakelists.txt中include进来。
3.假如不知道变量的名字怎么办?打开cmake,可以看到有很多变量和其值:
这里写图片描述
在CMakelists.txt通过如下set方法可以设置其值了。
这里写图片描述
这个设置可以让VS即使在x64平台仍然可以编译x86程序.
4.网上找到一个寻找OpenBlas库的.cmake文件内容如下:

SET(OPEN_BLAS_SEARCH_PATHS  /lib/ /lib64/  /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 /opt/OpenBLAS/lib $ENV{OPENBLAS_HOME}/lib )
FIND_LIBRARY(OPENBLAS NAMES openblas PATHS ${OPEN_BLAS_SEARCH_PATHS})

IF (OPENBLAS)
  SET(OPENBLAS_FOUND ON)
ENDIF (OPENBLAS)

IF (OPENBLAS_FOUND)
#  IF (NOT NATIVE_BLAS_LAPACK_FIND_QUIETLY)
     MESSAGE(STATUS "Found OpenBLAS")
#  ENDIF (NOT NATIVE_BLAS_LAPACK_FIND_QUIETLY)
ELSE(OPENBLAS_FOUND)
#  IF (NATIVE_BLAS_LAPACK_FIND_REQUIRED)
     MESSAGE(FATAL_ERROR "Could not find OpenBLAS libraries.")
#  ENDIF (NATIVE_BLAS_LAPACK_FIND_REQUIRED)
ENDIF (OPENBLAS_FOUND)

MARK_AS_ADVANCED(OPENBLAS)

网址参考:http://www.nektar.info/browser/cmake/FindOpenBlas.cmake
http://stackoverflow.com/questions/20328991/can-cmake-findblas-find-openblas
5.如何让CMakelists.txt像OpenCv中一样,用一个CMakelists.txt文件统领子目录下所有CMakelists.txt文件,方法在顶层CMakelists.txt中添加如下项目:
这里写图片描述
6.CMakelists.txt学习参考网址:
含有案例:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html
wiki:https://cmake.org/Wiki/CMake
官网Documentation:https://cmake.org/documentation/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值