muduo库学习笔记三:cmake使用解析

cmake是项目管理工具:简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。

在Linux平台下使用CMake生成Makefile并编译的流程如下:
A、编写CMake配置文件CMakeLists.txt
B、执行命令cmake PATH生成Makefile,PATH是CMakeLists.txt所在的目录。
C、使用make命令进行编译。

其中,A既是下文注释的文件,B、C都由muduo库中提供的build.sh完成,我们使用时只需要执行build.sh,这个bash脚本会帮我们完成B、C。

cmake_minimum_required(VERSION 2.6)
#cmake最小版本为2.6

project(muduo C CXX)
#project 用这个 定义工程名称,并指定工程支持的语言(可忽略)默认支持所有语言

enable_testing()

#设置生成Debug版本或者Release版本
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Debug")
#  set(CMAKE_BUILD_TYPE "Release")
endif()

#set指令可以用来显示的定义变量
#在cmake脚本中,设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。 
#使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的: 
#add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),
#而set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。

set(CXX_FLAGS
 -g
 # -DVALGRIND
 # -DMUDUO_STD_STRING
 -DCHECK_PTHREAD_RETURN_VALUE
 -D_FILE_OFFSET_BITS=64
 -Wall   #大部分警告
 -Wextra  #一些额外的警告
 -Werror  #当出现警告时转为错误,停止编译
 -Wconversion  #一些可能改变值的隐式转换,给出警告
 -Wno-unused-parameter   #函数中出现未使用的参数,不给出警告
 -Wold-style-cast   #C风格的转换,给出警告
 -Woverloaded-virtual   #如果函数的声明隐藏住了基类的虚函数,就给出警告
 -Wpointer-arith   #对函数指针或者void *类型的指针进行算术操作时给出警告
 -Wshadow   #当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告
 -Wwrite-strings   #规定字符串常量的类型是const char[length],因此,把这样的地址复制给 non-const char *指针将产生警告.这些警告能够帮助你在编译期间发现企图写入字符串常量的代码
 -march=native   #指定cpu体系结构为本地平台
 # -MMD
 # -std=c++0x
 -rdynamic
 )
if(CMAKE_BUILD_BITS EQUAL 32)
  list(APPEND CXX_FLAGS "-m32")
  #添加新element到list中
endif()
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}")

set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS_DEBUG "-O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -finline-limit=1000 -DNDEBUG")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

#EXECUTABLE_OUTPUT_PATH 设置二进制的输出路径 
#LIBRARY_OUTPUT_PATH  设置库的输出的路径
#CMAKE_CXX_COMPILER 指定Cxx编译器
 
 #CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 
 #和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变
 #量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串
 #作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,
 #工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项
 #生成 Makefile。

#PROJECT_BINARY_DIR = 如果是 in source 编译,指得就是工程顶层目录,如果是 out-of-source 编译,指的是工程编译发生的目录。
#CMAKE_INSTALL_PREFIX 用于定义相对安装路径在build.sh中定义

find_package(Boost REQUIRED)
find_package(Protobuf)
find_package(CURL)
find_package(ZLIB)
find_path(CARES_INCLUDE_DIR ares.h)
#CARES_INCLUDE_DIR 代表找到的ares.h的全路径包括文件名

find_library(CARES_LIBRARY NAMES cares)
find_path(MHD_INCLUDE_DIR microhttpd.h)
find_library(MHD_LIBRARY NAMES microhttpd)
find_library(BOOSTTEST_LIBRARY NAMES boost_unit_test_framework)
find_library(BOOSTPO_LIBRARY NAMES boost_program_options)
find_path(TCMALLOC_INCLUDE_DIR gperftools/heap-profiler.h)
find_library(TCMALLOC_LIBRARY NAMES tcmalloc_and_profiler)
find_path(HIREDIS_INCLUDE_DIR hiredis/hiredis.h)
find_library(HIREDIS_LIBRARY NAMES hiredis)
find_path(GD_INCLUDE_DIR gd.h)
find_library(GD_LIBRARY NAMES gd)
find_program(THRIFT_COMPILER thrift)
find_path(THRIFT_INCLUDE_DIR thrift)
find_library(THRIFT_LIBRARY NAMES thrift)


#message指令用于向终端输出用户定义的信息,
#有三种类型:
#SEND_ERROR 产生错误,生产过程被跳过
#STATUS 输出前缀为-的信息
#FATAL_ERROR,立即终止所有cmake过程

if(CARES_INCLUDE_DIR AND CARES_LIBRARY)
  message(STATUS "found cares")
endif()
if(CURL_FOUND)
  message(STATUS "found curl")
endif()
if(PROTOBUF_FOUND)
  message(STATUS "found protobuf")
endif()
if(TCMALLOC_INCLUDE_DIR AND TCMALLOC_LIBRARY)
  message(STATUS "found tcmalloc")
endif()
if(ZLIB_FOUND)
  message(STATUS "found zlib")
endif()
if(HIREDIS_INCLUDE_DIR AND HIREDIS_LIBRARY)
  message(STATUS "found hiredis")
endif()
if(GD_INCLUDE_DIR AND GD_LIBRARY)
  message(STATUS "found gd")
endif()
if(THRIFT_COMPILER AND THRIFT_INCLUDE_DIR AND THRIFT_LIBRARY)
  message(STATUS "found thrift")
endif()

include_directories(${Boost_INCLUDE_DIRS})

include_directories(${PROJECT_SOURCE_DIR})

string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
message(STATUS "CXX_FLAGS = " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})

#包含子目录
add_subdirectory(muduo/base)
#add_subdirectory(muduo/net)

#if(NOT CMAKE_BUILD_NO_EXAMPLES)
#  add_subdirectory(contrib)
#  add_subdirectory(examples)
#else()
#  if(CARES_INCLUDE_DIR AND CARES_LIBRARY)
#    add_subdirectory(examples/cdns)
#  endif()
#endif()

#包含子目录
 add_subdirectory(tests)

#子目录下的 CMakeLists.txt文件和源代码也会被处理 。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值