cmake使用详解


cmake使用笔记

之前一直使用MakeFile,看过一些开源项目后,了解到了cmake,它是一个跨平台的编译工具,不但能生成类unix系统下的makefile还能生成windows下project文件,这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

基本使用方法

cmake所的所有语句写在CMakeLists.txt中,
因为cmake生成makefile或project然后在编译时会生成很多中间文件,打乱项目文件结构,所以我们一般新建一个build目录,在里面编译。
基本操作只需要二步即可 :
1、cmake CMakeLists.txt文件目录
2、make
3、如果配置了安装路径,还可以进行make install 等.
Alt text

相较于makefile的优点

目前个人体感上的优点。
1、跨平台。
2、语法相较于makefile简洁不少,makefile有的,cmake基本都有。
3、编译显示自带进度,颜色,看着很舒服,(当然makefile肯定也能实现,省了不少事罢了)。
Alt text

下面讲讲常用语句:

常用语法

cmake_minimum_required

CMake要求的最低版本

project

项目名称

cmake_minimum_required (VERSION 2.8.7)
project (test_project)
PROJECT_SOURCE_DIR

项目根目录,也就是CmakeLists.txt目录的绝对路径。

set

设置变量
例如

###
# 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)
include_directories

包含头文件路径,类似于makfilede的-I
例如

###
# 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++)
link_directories

链接路径,类似于makfilede的-L

###
# libraries
###
link_directories("${PROJECT_SOURCE_DIR}/library")
link_directories("${OPEN_SOURCES_DIRECTORY}/library")
options

开关宏,类似于c/c++ #if #elseif #endif.
可以在使用cmake时通过 -D 来打开开关

如 :

cmake -Dx86_platfrom=ON ../
-- X86 Platform
-- Configuring done
-- Generating done
# x86 / arm switch
option(x86_platfrom    "Set to switch to build use x86" OFF)
option(arm_platfrom    "Set to switch to build use arm" ON)
if (x86_platfrom)
    message(STATUS "X86 Platform")
else ()
	SET(CMAKE_SYSTEM_NAME Linux)
	SET(CMAKE_SYSTEM_PROCESSOR arm) 
	SET(TOOLCHAIN_DIR "/opt/hisi-linux/x86-arm/arm-hisiv400-linux")
	SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
	SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
	SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
	SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

	SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-hisiv400-linux-gnueabi-gcc)
	SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-hisiv400-linux-gnueabi-g++)

    message(STATUS "arm Platform")
endif ()

常用变量

CMAKE_CURRENT_LIST_DIR

表示正在处理的CMakeLists.txt 文件的所在的目录的绝对路径(2.8.3 以及以后版本才支持)

CMAKE_ARCHIVE_OUTPUT_DIRECTORY

用于设置 ARCHIVE 目标的输出路径

CMAKE_LIBRARY_OUTPUT_DIRECTORY

用于设置 LIBRARY 目标的输出路径

CMAKE_RUNTIME_OUTPUT_DIRECTORY

用于设置 RUNTIME 目标的输出路径

LIBRARY_OUTPUT_PATH

用于设置 库文件 的输出路径

EXECUTABLE_OUTPUT_PATH

用于设置 可执行文件的输出路径

例如

###
# 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)

编译链接标志

CMAKE_C_FLAGS
CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]

C 编译标志相关变量。

CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]

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

添加要生成的库文件
语法: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 命令
语法: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_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

如果想添加一个子项目或者模块,可以用它进行构建的子目录
语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

add_subdirectory(${OPEN_SOURCES_DIRECTORY}/cpp_redis)

Debug和Release版本

暂不多详述,简单介绍一下。
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 .” 进入一个图形化界面。

调试手段

message

打印信息,类似于 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}")
CMAKE_VERBOSE_MAKEFILE

显示详细的原始编译信息,主要用于定位一些链接错误,看看库路径什么的是否配置对。

# print compile info
set(CMAKE_VERBOSE_MAKEFILE ON)

或者执行make时
$ make VERBOSE=1
或者
$ export VERBOSE=1
$ make
你讲能看到如下所示详细编译信息
Alt text

cmake示例

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使用,所用到的一些基本语法,和基本编译调试手段的一点笔记,后续如有新玩法另加。

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一个跨平台的自动化构建工具,可以用于生成各种不同类型的构建文件,包括Makefile、Visual Studio解决方案、Xcode项目等。下面是CMake使用方法详解: 1. 安装CMake 首先需要在官网上下载并安装CMake软件。安装完成后,可以在命令行中输入cmake --version来确认是否安装成功。 2. 创建一个CMakeLists.txt文件 在项目根目录下创建一个名为CMakeLists.txt的文件,该文件是CMake的核心配置文件,定义了项目的构建规则。可以使用文本编辑器或者IDE来创建这个文件。 3. 设置项目信息 在CMakeLists.txt文件中,需要设置项目的基本信息,包括项目名称、版本号、语言等。这可以通过使用project命令来实现。例如: ``` project(MyProject VERSION 1.0 LANGUAGES CXX) ``` 这里设置了项目名称为MyProject,版本号为1.0,使用C++作为编程语言。 4. 定义源文件 在CMakeLists.txt文件中,需要定义项目的源文件。可以使用add_executable或add_library命令来添加源文件。例如: ``` add_executable(myapp main.cpp) ``` 这里添加了一个名为myapp的可执行文件,它的源文件是main.cpp。 5. 添加依赖库 如果项目依赖于其他库,需要使用find_package或者add_subdirectory命令来添加依赖库。例如: ``` find_package(Boost REQUIRED COMPONENTS filesystem system) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(myapp ${Boost_LIBRARIES}) ``` 这里添加了一个名为Boost的库,它的组件是filesystem和system。 6. 设置编译选项 在CMakeLists.txt文件中还可以设置编译选项,例如编译标志、链接标志等。可以使用target_compile_options和target_link_libraries命令来设置编译选项。例如: ``` target_compile_options(myapp PRIVATE -Wall -Wextra) target_link_libraries(myapp pthread) ``` 这里设置了编译标记为-Wall和-Wextra,链接标记为pthread。 7. 构建项目 完成以上步骤后,就可以使用cmake命令来生成构建文件,例如: ``` mkdir build cd build cmake .. ``` 这里在项目根目录下创建了一个build目录,并在其中使用cmake命令生成Makefile文件。 最后,使用make命令来编译和构建项目。例如: ``` make ``` 这里编译和构建了项目,并生成myapp可执行文件。 以上就是CMake使用方法详解。通过CMake,可以方便地管理项目的构建过程,实现跨平台的构建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值