zoukankan      html  css  js  c++  java
  • 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++)
    

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

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

    常用变量

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

  • 相关阅读:
    旋转加载loading和点点加载loadingdemo
    css 点点加载demo
    gulp——myself配置
    AngularJS官网seed目录结构
    CSS content换行技术实现字符animation loading效果
    gulp入门与一些基本设置
    css 图标 旋转中
    【图文教程】WebStorm下使用Github下载以及上传代码
    gulp-uglify的使用
    面试题 ——— 二维数组的查找
  • 原文地址:https://www.cnblogs.com/ailumiyana/p/10721123.html
Copyright © 2011-2022 走看看