源码:https://github.com/panyingyun/cmakedemo

更好的管理多文件

cmakeb/
|-- build
|   |-- auto_build_close_macro.bat
|   |-- auto_build_close_macro.sh
|   |-- auto_build_open_macro.bat
|   `-- auto_build_open_macro.sh
|-- cmakeb.cpp
|-- CMakeLists.txt
|-- msqrt
|   |-- CMakeLists.txt
|   |-- msqrt.cpp
|   `-- msqrt.h
`-- msquare
    |-- CMakeLists.txt
    |-- msquare.cpp
    `-- msquare.h

还是以cmakeb工程为例,说明一下几个常用关键字的使用

  1. project(project_name)

给工程起个名字

  1. include_directories(header_dir)

工程依赖的头文件目录,比如include_directories(${CMAKE_CURRENT_LIST_DIR}/msqrt ${CMAKE_CURRENT_LIST_DIR}/msquare)

CMAKE_CURRENT_LIST_DIR 表示当前CMakeLists.txt文件列表目录

  1. aux_source_directory(${CMAKE_CURRENT_LIST_DIR} DIR_SRCS)

将当前路径目录下的所有源文件路径放到变量DIR_SRCS中 这样在add_executable(cmakeb ${DIR_SRCS})就不用手动添加文件列表了

  1. link_directories(lib_dir1 lib_dir2)

工程依赖库所在的路径,和include_directories类似的命令

  1. add_executable(${PROJECT_NAME} ${DIR_SRCS})

使用${DIR_SRCS}来生成可执行文件

  1. target_link_libraries(${PROJECT_NAME} util )

生成target名字为${PROJECT_NAME},依赖的库libutil.lib/libutil.a

  1. 传递FLAGS给C++编译器
set(CMAKE_CXX_COMPILER      "clang++" )         # 显示指定使用的C++编译器

set(CMAKE_CXX_FLAGS   "-std=c++11")             # c++11
set(CMAKE_CXX_FLAGS   "-g")                     # 调试信息
set(CMAKE_CXX_FLAGS   "-Wall")                  # 开启所有警告

set(CMAKE_CXX_FLAGS_DEBUG   "-O0" )             # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " )   # release包优化

解释:

  • CMAKE_CXX_FLAGS 是CMake传给C++编译器的编译选项,通过设置这个值就好比 g++ -std=c++11 -g -Wall

  • CMAKE_CXX_FLAGS_DEBUG 是除了CMAKE_CXX_FLAGS外,在Debug配置下,额外的参数

  • CMAKE_CXX_FLAGS_RELEASE 同理,是除了CMAKE_CXX_FLAGS外,在Release配置下,额外的参数

  1. CMake 输出所有的编译过程

cmake .. make VERBOSE=1 或者 cmake -DCMAKE_VERBOSE_MAKEFILE=ON .. make 或者 CMakeLists.txt 中增加 set( CMAKE_VERBOSE_MAKEFILE on ) 都可以做到

后面会有几个例子用来整个这些命令,先来优化一下cmakeb中的cmakefile.txt看看

CMakeLists.txt如下

cmake_minimum_required(VERSION 2.8)
 
PROJECT(cmakeb)

option(USE_SQRT  "Set to switch to build use USE_SQRT"  ON)
if(USE_SQRT)
	add_definitions(-DUSE_SQRT)
	message(STATUS "APP OPEN MACROS USE_SQRT")
endif()

include_directories(${CMAKE_CURRENT_LIST_DIR}/msqrt ${CMAKE_CURRENT_LIST_DIR}/msquare)
link_directories(${CMAKE_CURRENT_LIST_DIR}/msqrt ${CMAKE_CURRENT_LIST_DIR}/msquare)

#add all source current dir
aux_source_directory(. DIR_SRCS)

add_subdirectory(msqrt)
add_subdirectory(msquare)
  
add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${DIR_SRCS})

target_link_libraries(${PROJECT_NAME} msqrt msquare)

#set(CMAKE_CXX_COMPILER      "clang++" )         # 显示指定使用的C++编译器

set(CMAKE_CXX_FLAGS   " -std=c++11 -Wall")

set(CMAKE_CXX_FLAGS_DEBUG   "-O0 -g" )             # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " )   # release包优化
set(CMAKE_VERBOSE_MAKEFILE on)

Debug编译模式

cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .

编译

Release编译模式

cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . 

编译

更多cmake知识请参考: