目录mysql
以前一直使用MakeFile,看过一些开源项目后,了解到了cmake,它是一个跨平台的编译工具,不但能生成类unix系统下的makefile还能生成windows下project文件,这使得熟悉某个集成开发环境(IDE)的开发者能够用标准的方式建构他的软件,这种能够使用各平台的原生建构系统的能力是 CMake 和 SCons 等其余相似系统的区别之处。c++
cmake所的全部语句写在CMakeLists.txt中,
由于cmake生成makefile或project而后在编译时会生成不少中间文件,打乱项目文件结构,因此咱们通常新建一个build目录,在里面编译。
基本操做只须要二步便可 :
一、cmake CMakeLists.txt文件目录
二、make
三、若是配置了安装路径,还能够进行make install 等.
redis
目前我的体感上的优势。
一、跨平台。
二、语法相较于makefile简洁很多,makefile有的,cmake基本都有。
三、编译显示自带进度,颜色,看着很舒服,(固然makefile确定也能实现,省了很多事罢了)。
sql
下面讲讲经常使用语句:windows
CMake要求的最低版本async
项目名称tcp
cmake_minimum_required (VERSION 2.8.7) project (test_project)
项目根目录,也就是CmakeLists.txt目录的绝对路径。工具
设置变量
例如优化
### # variables ### set(SOURCES_DIRECTORY ${PROJECT_SOURCE_DIR}/sources) set(OPEN_SOURCES_DIRECTORY ${PROJECT_SOURCE_DIR}/open_sources) set(INCLUDES_DIRECTORY ${PROJECT_SOURCE_DIR}/includes) set(MUDUO_LOGGER_INCLUDES ${INCLUDES_DIRECTORY}/muduo_logger) set(MUDUO_NETWORK_INCLUDES ${INCLUDES_DIRECTORY}/muduo_network) set(CPP_REDIS_INCLUDES ${OPEN_SOURCES_DIRECTORY}/cpp_redis/includes)
包含头文件路径,相似于makfilede的-I
例如ui
### # includes ### include_directories(${INCLUDES_DIRECTORY} ${MUDUO_LOGGER_INCLUDES} ${MUDUO_NETWORK_INCLUDES} ${SOURCES_DIRECTORY}/sip_server ${CPP_REDIS_INCLUDES} ${OPEN_SOURCES_DIRECTORY}/includes ${OPEN_SOURCES_DIRECTORY}/includes/mysql++)
连接路径,相似于makfilede的-L
### # libraries ### link_directories("${PROJECT_SOURCE_DIR}/library") link_directories("${OPEN_SOURCES_DIRECTORY}/library")
表示正在处理的CMakeLists.txt 文件的所在的目录的绝对路径(2.8.3 以及之后版本才支持)
用于设置 ARCHIVE 目标的输出路径
用于设置 LIBRARY 目标的输出路径
用于设置 RUNTIME 目标的输出路径
用于设置 库文件 的输出路径
用于设置 可执行文件的输出路径
例如
### # outputs ### #set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) #set(CMAKE_PKGCONFIG_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgconfig) #set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/library) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
C 编译标志相关变量。
C++ 编译标志相关变量。
CMAKE_C_FLAGS 或CMAKE_CXX_FLAGS 能够指定编译标志
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]或 CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO] 则指定特定构建类型的编译标志,这些编译标志将被加入到 CMAKE_C_FLAGS 或 CMAKE_CXX_FLAGS 中去,例如,若是构建类型为 DEBUG,那么 CMAKE_CXX_FLAGS_DEBUG 将被加入到 CMAKE_CXX_FLAGS中去
还有连接标志相关变量,做用相似
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]
### # compilation options ### set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -W -Wall -Wextra -O3")
添加要生成的库文件
语法:add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)
用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为 name,默认是静态库.
例如
### #library ### add_library(async_logging ${muduo_logger_sources}) add_library(muduo_server ${muduo_network_sources})
add_executable 命令
语法:add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)
用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 name
### # executable ### add_executable(sip_server ${test_excutable }) add_executable(mysql_use_test ${mysql_use_test_sources})
语法: target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)
用于指定 target 连接的依赖项 item1 item2 …。
例如:
### # link librarys ### target_link_libraries(async_logging pthread) target_link_libraries(muduo_server async_logging) target_link_libraries(muduo_server pthread) target_link_libraries(test_excutable async_logging muduo_server pthread cpp_redis tacopie)
若是想添加一个子项目或者模块,能够用它进行构建的子目录
语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
add_subdirectory(${OPEN_SOURCES_DIRECTORY}/cpp_redis)
暂很少详述,简单介绍一下。
debug 版的项目生成的可执行文件须要有调试信息而且不须要进行优化,、
release 版的不须要调试信息但须要优化。这些特性在 gcc/g++ 中是经过编译时的参数来决定的,若是将优化程度调到最高须要设置参数-O3,最低是 -O0 即不作优化;添加调试信息的参数是 -g -ggdb ,若是不添加这个参数,调试信息就不会被包含在生成的二进制文件中。
例
PROJECT(main) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) SET(CMAKE_SOURCE_DIR .) SET(CMAKE_CXX_FLAGS_DEBUG"$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE"$ENV{CXXFLAGS} -O3 -Wall") AUX_SOURCE_DIRECTORY(. DIR_SRCS) ADD_EXECUTABLE(main ${DIR_SRCS})
两个变量 CMAKE_CXX_FLAGS_DEBUG 和CMAKE_CXX_FLAGS_RELEASE, 分别用于 debug 和 release 的编译选项。编辑 CMakeList.txt 后须要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 "ccmake ." 进入一个图形化界面。
打印信息,相似于 echo/printf ,主要用于查cmake文件的语法错误。
set(mysql_use_test_sources ${SOURCES_DIRECTORY}/test_sources/mysql_user_accounts.cpp) message("mysql_use_test_sources : ${mysql_use_test_sources}")
显示详细的原始编译信息,主要用于定位一些连接错误,看看库路径什么的是否配置对。
# print compile info set(CMAKE_VERBOSE_MAKEFILE ON)
或者执行make时
$ make VERBOSE=1
或者
$ export VERBOSE=1
$ make
你讲能看到以下所示详细编译信息
cmake_minimum_required (VERSION 2.8.7) project (ws_tcp_server) ### # variables ### set(SOURCES_DIRECTORY ${PROJECT_SOURCE_DIR}/sources) set(OPEN_SOURCES_DIRECTORY ${PROJECT_SOURCE_DIR}/open_sources) set(INCLUDES_DIRECTORY ${PROJECT_SOURCE_DIR}/includes) set(MUDUO_LOGGER_INCLUDES ${INCLUDES_DIRECTORY}/muduo_logger) set(MUDUO_NETWORK_INCLUDES ${INCLUDES_DIRECTORY}/muduo_network) set(CPP_REDIS_INCLUDES ${OPEN_SOURCES_DIRECTORY}/cpp_redis/includes) ### # includes ### include_directories(${INCLUDES_DIRECTORY} ${MUDUO_LOGGER_INCLUDES} ${MUDUO_NETWORK_INCLUDES} ${CPP_REDIS_INCLUDES}) ### # libraries ### link_directories("${PROJECT_SOURCE_DIR}/library") ### # outputs ### #set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) #set(CMAKE_PKGCONFIG_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgconfig) #set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/library) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) ### # compilation options ### set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMYSQLPP_MYSQL_HEADERS_BURIED -std=c++11 -g -W -Wall -Wextra -O3") # print compile info #set(CMAKE_VERBOSE_MAKEFILE ON) ### # sources file ### set(MUDUO_NETWORK_SOURCES_DIRECTORY ${SOURCES_DIRECTORY}/muduo_network) set(MUDUO_LOGGER_SOURCES_DIRECTORY ${SOURCES_DIRECTORY}/muduo_logger) set(TEST_EXUTE_SOURCES_DIRECTORY ${SOURCES_DIRECTORY}/test_exute) foreach(dir ${MUDUO_LOGGER_SOURCES_DIRECTORY}) # get directory sources and headers file(GLOB s_${dir} "${dir}/*.cpp") file(GLOB h_${dir} "${dir}/*.hpp") # set async_logger sources set(muduo_logger_sources ${s_${dir}} ${h_${dir}}) endforeach() foreach(dir ${MUDUO_NETWORK_SOURCES_DIRECTORY}) # get directory sources and headers file(GLOB s_${dir} "${dir}/*.cpp") file(GLOB h_${dir} "${dir}/*.hpp") # set muiduo_network sources set(muduo_network_sources ${s_${dir}} ${h_${dir}}) endforeach() #message("muduo_network_sources: ${muduo_network_sources}") set(test_exute_sources ${WS_SERVER_SOURCES_DIRECTORY}/test_exute.cpp ${WS_SERVER_SOURCES_DIRECTORY}/main.cpp) #message("test_exute_sources : ${test_exute_sources}") ### #library ### add_library(async_logging ${muduo_logger_sources}) add_library(muduo_server ${muduo_network_sources}) ### # executable ### add_executable(test_exute ${test_exute_sources})
这些是到目前对cmake使用,所用到的一些基本语法,和基本编译调试手段的一点笔记,后续若有新玩法另加。