zoukankan      html  css  js  c++  java
  • Cmake用法

    cmake --version 3.10 doc

    1,Cmake introduce

    CMake是一种跨平台编译工具,用来生成makefile。CMake主要是编写CMakeLists.txt文件,然后用cmake命令执行CMakeLists.txt文件生成make所需要的makefile文件,最后用make命令编译源码生成可执行程序或库文件。
    cmake 指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如

    mkdir ckbuild
    cd ckbuild
    cmake ..
    make
    

    1.1 常用的目录结构

    .
    ├── build
    ├── CMakeLists.txt
    ├── include
    │   └── xxx.h
    └── src
        ├── xxx.c
        └── main.c
    

    2,CMakeLists.txt文件的写法

    编写CMakeLists.txt文件,该文件一般放在和src,include的同级目录

    #1.cmake verson,指定cmake版本 
    cmake_minimum_required(VERSION 3.5)
    
    #2.project name,指定项目的名称,一般和项目的文件夹名称对应
    PROJECT(findstr)
    
    #3.head file path,头文件目录
    INCLUDE_DIRECTORIES(
    include
    )
    
    #4.source directory,源文件目录
    AUX_SOURCE_DIRECTORY(src DIR_SRCS)
    
    #5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
    SET(TEST_MATH
    ${DIR_SRCS}
    )
    
    #6.add executable file,添加要编译的可执行文件
    ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
    
    #7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
    #TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
    

    Cmake 常用命令

    Scripting Commands

    set

    设置常规变量
    set(<variable> <value>... [PARENT_SCOPE])
    设置环境变量
    set(ENV{<variable>} <value>...)

    include

    include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
    从一个文件或模块加载并且运行cmake代码

    Project Commands

    add_executable

    add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
    用指定的源文件创建一个可执行文件
    创建一个名字为name 的可执行文件,name 在一个工程内必须是全局唯一的,可执行文件的实际名字会根据所在平台从新构造,
    (such as <name>.exe or just <name>).

    add_library

    add_library
        Normal Libraries
        Imported Libraries
        Object Libraries
        Alias Libraries
        Interface Libraries
    

    Normal Libraries
    add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
    创建一个名字为name 的库,name 在一个工程内必须是全局唯一的,实际名字会根据所在平台进行转化,
    (such as lib<name>.a or <name>.lib).
    库的类型也许被指定为:STATIC, SHARED, or MODULE 。静态库在链接到其它文件的时候被使用,动态库是动态链接在运行时加载,
    MODULE 库不被链接到别的文件,也许在运行时被加载。
    如果没有说明是静态还是共享,则依据变量BUILD_SHARED_LIBS是否打开来确定类型。
    如果变量BUILD_SHARED_LIBS没有使用,默认是静态库,用法示例:

    add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)
    add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)
    

    aux_source_directory

    aux_source_directory(<dir> <variable>)
    把目录“dir”中的所有源文件的名字存在变量"variable"中。

    include_directories

    include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
    为编译器器添加头文件的搜索路径,这些头文件目录将被添加到当前的CMakeLists文件的INCLUDE_DIRECTORIES属性中。

    project

    project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
    project(<PROJECT-NAME>
            [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
            [DESCRIPTION <project-description-string>]
            [LANGUAGES <language-name>...])
    

    为整个工程设置名称,版本,和使用的语言。
    设置的工程名存储在变量PROJECT_NAME中。

    cmake_minimum_required

    cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])

    这个命令放在 CMakeLists.txt 的最前面,为工程设定最低的cmake版本。
    如果cmake版本低于要求,会停止编译,并报错。

    编译选项宏设置

    (ref)[https://www.linuxidc.com/Linux/2014-03/98622.htm]
    三 生成可调试版本的程序

    1使用CMAKE编译确实很方便。但CMAKE默认编译出来的程序不带有符号文件,用GDB无法调试。

    2 要编译时产生符号文件供调试,调用CMAKE时,带上 -DCMAKE_BUILD_TYPE=Debug

    例如:在build文件中输入:

    cmake .. -DCMAKE_BUILD_TYPE=Debug

    这样产生的makefile文件make生成的可执行文件就带有调试信息,供gdb和gdbserver使用了。

    *****另外有另一种更好的方法是在工程主CMakeLists.txt中的PROJECT语句后加入一句

    SET(CMAKE_BUILD_TYPE Debug)

    CMake 中有一个变量 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。

    gcc 编译时候加入宏信息

    编译时需添加-gdwarf-2和-g3两个参数。

    加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。

    https://blog.csdn.net/zhangjs0322/article/details/39666889

  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/ims-/p/10201845.html
Copyright © 2011-2022 走看看