CMake
CMake也是一种用于自动化构建软件项目的工具。Cmake可以自动输出MakeFile文件,并且CMake是一个跨平台的构建系统,对于复杂的、跨平台的项目,CMake可能是一个更好的解决方案。
CMake的脚本文件是在CMakeLists.txt中,例如
# 单个目录实现 # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 工程,他不是执行文件名 PROJECT(0VOICE) # 手动加入文件 ${变量名}} ,比如${SRC_LIST} SET(SRC_LIST main.c) SET(SRC_LIST2 main2.c) # MESSAGE和echo类似 MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR}) MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR}) # 生产执行文件名0voice 0voice2 ADD_EXECUTABLE(0voice ${SRC_LIST}) ADD_EXECUTABLE(0voice2 ${SRC_LIST2})
在当前文件夹下可以使用**cmake .**来编译代码。编译完之后会生成我们的MakeFile文件。
但是这样生成的中间文件太多了,和代码文件混在一个文件夹中。更常见的做法是,首先在目录下创建一个build文件夹,然后在build文件夹下执行**cmake …**来编译文件。
语法
示例:
cmake_minimum_required(VERSION 2.6) PROJECT(loginserver) AUX_SOURCE_DIRECTORY(./ SRC_LIST) #SET(LIBRARY_OUTPUT_PATH ./) SET(EXECUTABLE_OUTPUT_PATH ./) if(APPLE) SET(PB_LIB_DIR ../base/pb/lib/mac) elseif(UNIX) SET(PB_LIB_DIR ../base/pb/lib/linux) endif() ADD_DEFINITIONS( -g -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO -DAC_HAS_WARNING -DAC_HAS_ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL -DAC_HAS_DEBUG -DLINUX_DAEMON -std=c++11) INCLUDE_DIRECTORIES(./ ../base ../base/pb/protocol ../base/jsoncpp/ ../base/pb/ ../protobuf/include) LINK_DIRECTORIES(./ ../base ${PB_LIB_DIR} ../base/slog/lib) #ADD_XXXX必须在TARGET_LINK_LIBRARIES前面,否则会报错 #ADD_LIBRARY(${PROJECTNAME} SHARED/STATIC ${SRC_LIST}) ADD_EXECUTABLE(login_server ${SRC_LIST}) TARGET_LINK_LIBRARIES(login_server base protobuf-lite slog pthread)
- PROJECT(loginserver):定义工程名称为loginserver;
- AUX_SOURCE_DIRECTORY(./ SRC_LIST):将当前目录所有源代码文件存储在SRC_LIST中。
- SET(EXECUTABLE_OUTPUT_PATH ./):定义变量EXECUTABLE_OUTPUT_PATH为./;这里目的是保存一个文件夹地址。
- SET(PB_LIB_DIR …/base/pb/lib/linux):将变量PB_LIB_DIR 定义为…/base/pb/lib/linux;这里目的也是保存一个文件夹地址。
- ADD_DEFINITIONS( -g -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO-DAC_HAS_WARNING -DAC_HAS_ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL-DAC_HAS_DEBUG -DLINUX_DAEMON -std=c++11):向编译器添加编译选项和预处理器定义。
- -g:生成的可执行文件会带调试信息,生成调试执行文件时使用
- -W:启用所有编译器警告
- -Wall:启用几乎所有编译器警告
- -D_REENTRANT:定义宏,表示使用多线程支持的库函数版本。
- -D_FILE_OFFSET_BITS=64:定义宏,表示使用64位文件偏移量。
- -DAC_HAS_INFO:定义宏,启用信息级别的日志记录。
- -DAC_HAS_WARNING :定义宏,启用警告级别的日志记录。
- -DAC_HAS_ERROR :定义宏,启用错误级别的日志记录。
- -DAC_HAS_CRITICAL :定义宏,启用关键级别的日志记录。
- -DTIXML_USE_STL:定义宏,表示使用C++标准库(STL)版本的TinyXML库。
- -DAC_HAS_DEBUG :定义宏:表示启用某些调试级别的日志记录。
- -DLINUX_DAEMON :定义宏,表示程序将作为Linux守护进程运行。
- -std=c++11:指定使用C++11标准进行编译。
- INCLUDE_DIRECTORIES(./ …/base …/base/pb/protocol …/base/jsoncpp/ …/base/pb/ …/protobuf/include):引入多个头文件搜索路径。引入的是一些非标准(非系统头文件)的头文件。
- LINK_DIRECTORIES(./ …/base ${PB_LIB_DIR} …/base/slog/lib):引入非标准的库文件搜索路径。
- ADD_EXECUTABLE(login_server ${SRC_LIST}):定义这个工程会生成一个文件名为login_server 的可执行文件,相关的源文件是SRC_LIST中定义的源文件目录。
- TARGET_LINK_LIBRARIES(login_server base protobuf-lite slog pthread)::为将生成的可执行文件添加需要链接的共享库。