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

  • 相关阅读:
    day15---作业
    day14---函数的参数
    day14作业
    day--13函数的基本使用
    day13--函数练习(作业)
    day12--文件处理
    day12--作业
    Python函数对象、函数嵌套和闭包函数
    每日作业以及周末作业
    Python名称空间与作用域
  • 原文地址:https://www.cnblogs.com/ims-/p/10201845.html
Copyright © 2011-2022 走看看