cmake学习04 - 更好的管理多文件
源码: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工程为例,说明一下几个常用关键字的使用
- project(project_name)
给工程起个名字
- include_directories(header_dir)
工程依赖的头文件目录,比如include_directories(${CMAKE_CURRENT_LIST_DIR}/msqrt ${CMAKE_CURRENT_LIST_DIR}/msquare)
CMAKE_CURRENT_LIST_DIR 表示当前CMakeLists.txt文件列表目录
- aux_source_directory(${CMAKE_CURRENT_LIST_DIR} DIR_SRCS)
将当前路径目录下的所有源文件路径放到变量DIR_SRCS中 这样在add_executable(cmakeb ${DIR_SRCS})就不用手动添加文件列表了
- link_directories(lib_dir1 lib_dir2)
工程依赖库所在的路径,和include_directories类似的命令
- add_executable(${PROJECT_NAME} ${DIR_SRCS})
使用${DIR_SRCS}来生成可执行文件
- target_link_libraries(${PROJECT_NAME} util )
生成target名字为${PROJECT_NAME},依赖的库libutil.lib/libutil.a
- 传递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配置下,额外的参数
- 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 .