精华内容
下载资源
问答
  • Cmake使用教程

    2020-12-10 22:14:20
    Cmake使用教程 https://www.hahack.com/codes/cmake/ cmake与vscode调试 在工作空间的CMakeList下添加一下命令 add_definitions(-std=c++11) set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_BUILD_FLAAGS_DEBUG "$ENV{...

    Cmake使用教程

    https://www.hahack.com/codes/cmake/

    cmake与vscode调试

    在工作空间的CMakeList下添加一下命令

    add_definitions(-std=c++11)
    set(CMAKE_BUILD_TYPE "Debug")
    set(CMAKE_BUILD_FLAAGS_DEBUG "$ENV{CXXFLAGS} -00 -Wall -g -ggdb")
    set(CMAKE_BUILD_FLAAGS_RELEASE "$ENV{CXXFLAGS} -03 -Wall")
    
    展开全文
  • CMake使用教程

    2017-11-13 04:21:00
    转自RichardXG原文CMake使用教程 CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。 通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译...

    转自 RichardXG 原文 CMake使用教程

    CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
    通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。
    如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。
    总之,CMake是一个非常强大的编译自动配置工具,支持各种平台,KDE也是用它编译的,感兴趣的可以试用一下。
     
    准备活动:
    (1)安装cmake。
    根据自己的需要下载相应的包即可,Windows下可以下载zip压缩的绿色版本,还可以下载源代码。
    (2)运行cmake的方法。(GUI、命令行)

    CMake使用步骤:
    运行GUI的cmake界面:
    cmake-2.8.1-win32-x86/bin/cmake-gui.exe

    执行Configure:
    运行之后,生成了如下文件:

    生成Makefile:
    执行Generate之后生成如下文件:
    运行make进行编译:
    编译完成后,在build目录生成Tutorial.exe,运行Tutorial.exe 25就可以看到运行结果:
    运行make install安装程序:
    运行make test进行测试:

     
    通过cmake tutorial学习CMake配置方法
    http://www.cmake.org/cmake/help/cmake_tutorial.html
    可以在源代码的Tests/Turorial目录中找到这个手册对应的代码。
    1、Step1。
    (如果不知道如何使用cmake,以及如何使用编译产生的Turorial.exe,可先看下前面“CMake使用步骤”的说明,它以Step4为例详细介绍了使用过程,Step1的配置可能不够完全,比如无法运行make install,无法运行make test,但可以参考。)
    简单的程序编译。
    (1)运行GUI的cmake,指定要编译的源代码路径和二进制文件路径(会自动创建)。
    (2)点击Configure,配置成功后,再点击Generate。
    配置需要选择合适的编译器,虽然我安装了VC2008,但没有配置成功;选择Unix Makefiles,配置成功,它自动找到了DevC++下的gcc.exe等编译器。
    (3)在build3目录执行make,就能够编译生成Turorial.exe了。
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>make
    Linking CXX executable Tutorial.exe
    [100%] Built target Tutorial
    可以运行一下Turorial.exe:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>Tutorial.exe
    Tutorial.exe Version 1.0
    Usage: Tutorial.exe number
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>Tutorial.exe 4
    The square root of 4 is 2
    2、Step2
    把子目录编译为库,并且链接到最终的可执行文件。
    include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") 
    add_subdirectory (MathFunctions) # 使得子目录MathFunctions也能被编译
    # add the executable
    add_executable (Tutorial tutorial.cxx)
    target_link_libraries (Tutorial MathFunctions)
    产生makefile:
    在GUI上点击Configure,之后Generate还是灰色,再次点击Configure,Generate就可以点击了。
    编译:
    在build目录运行make,即可开始编译,但是开始会报告sh.exe运行异常,应该是Tools下的UnxUtils的sh.exe与Win7不兼容,发现有如下make文件,估计是它导致的,于是把它重命名,不使用UnxUtils下的make,就OK乐。
    D:/Tools/CMD/UnxUtils/usr/local/wbin/make.exe
    编译过程:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step2/build>make
    [ 50%] Building CXX object MathFunctions/CMakeFiles/MathFunctions.dir/mysqrt.cxx
    .obj
    Linking CXX static library libMathFunctions.a
    [ 50%] Built target MathFunctions
    Linking CXX executable Tutorial.exe
    [100%] Built target Tutorial

    3、Step3
    支持make install把程序安装到系统指定目录,并且运行一些测试检查它是否能够正常工作。
    a、安装时使用的基础目录,由CMAKE_INSTALL_PREFIX指定。
    b、可以通过一个很简单的用例检查程序是否运行起来,没有出现异常。(TurotialRuns只是一个用例名字)
    add_test (TutorialRuns Tutorial 25)
    c、macro方式进行多组数据的测试是非常简洁方便的。
    #define a macro to simplify adding tests, then use it
    macro (do_test arg result)
    add_test (TutorialComp${arg} Tutorial ${arg})
    set_tests_properties (TutorialComp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result})
    endmacro (do_test)
    # do a bunch of result based tests
    do_test (25 "25 is 5")
    do_test (-25 "-25 is 0")
    执行make install:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make install
    [ 50%] "Built target MathFunctions"
    [100%] "Built target Tutorial"
    Install the project...
    -- Install configuration: ""
    -- Installing: C:/Program Files/Tutorial/bin/Tutorial.exe
    -- Installing: C:/Program Files/Tutorial/include/TutorialConfig.h
    -- Installing: C:/Program Files/Tutorial/bin/libMathFunctions.a
    -- Installing: C:/Program Files/Tutorial/include/MathFunctions.h
    安装结果:
    C:/Program Files/Tutorial>tree /f
    C:.
    ├─bin
    │ libMathFunctions.a
    │ Tutorial.exe

    └─include
    MathFunctions.h
    TutorialConfig.h
    执行make test:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make test
    Running tests...
    Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
    Start 1: TutorialRuns
    1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
    Start 2: TutorialComp25
    2/5 Test #2: TutorialComp25 ................... Passed 0.01 sec
    Start 3: TutorialNegative
    3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
    Start 4: TutorialSmall
    4/5 Test #4: TutorialSmall .................... Passed 0.00 sec
    Start 5: TutorialUsage
    5/5 Test #5: TutorialUsage .................... Passed 0.00 sec
    100% tests passed, 0 tests failed out of 5
    Total Test time (real) = 0.13 sec
    修改一个测试用例,让它不过:
    修改顶层CMakeLists.txt,然后重新Configure和Generate,然后make test即可看到结果。
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make test
    Running tests...
    Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
    Start 1: TutorialRuns
    1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
    Start 2: TutorialComp25
    2/5 Test #2: TutorialComp25 ...................***Failed Required regular expre
    ssion not found.Regex=[25 is 3
    ] 0.01 sec
    Start 3: TutorialNegative
    3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
    Start 4: TutorialSmall
    4/5 Test #4: TutorialSmall .................... Passed 0.01 sec
    Start 5: TutorialUsage
    5/5 Test #5: TutorialUsage .................... Passed 0.01 sec
    80% tests passed, 1 tests failed out of 5
    Total Test time (real) = 0.13 sec
    The following tests FAILED:
    2 - TutorialComp25 (Failed)
    Errors while running CTest
    make: *** [test] Error 8

    4、Step4
    检查系统是否支持log和exp函数。(log和exp都是数学运算函数)
    检查方法:
    (1)顶层配置中使用CheckFunctionExists.cmake
    # does this system provide the log and exp functions?
    include (CheckFunctionExists.cmake)
    check_function_exists (log HAVE_LOG)
    check_function_exists (exp HAVE_EXP)
    (2)修改.in文件,定义宏。(修改TutorialConfig.h.in,cmake执行中会把宏定义为合适的值,生成TurorialConfig.h,供编译时使用)
    // does the platform provide exp and log functions?
    #cmakedefine HAVE_LOG
    #cmakedefine HAVE_EXP
    (3)在代码中使用宏和log函数等。
    // if we have both log and exp then use them
    #if defined (HAVE_LOG) && defined (HAVE_EXP)
    result = exp(log(x)*0.5);
    #else // otherwise use an iterative approach
    Step4的完整配置、生成Makefile、编译、运行、安装、测试过程,参见最前面的“CMake使用步骤”。

    5、Step5
    动态生成源文件,自动把源文件编译进系统中。
    make的时候出错了:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step5/build>make
    Scanning dependencies of target MakeTable
    [ 25%] Building CXX object MathFunctions/CMakeFiles/MakeTable.dir/MakeTable.cxx.
    obj
    Linking CXX executable MakeTable.exe
    [ 25%] "Built target MakeTable"
    [ 50%] Generating Table.h
    '.' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    make[2]: *** [MathFunctions/Table.h] Error 1
    make[1]: *** [MathFunctions/CMakeFiles/MathFunctions.dir/all] Error 2
    make: *** [all] Error 2
    问题分析:
    首先看build/makefile文件,关于MakeTable有如下规则:
    # Build rule for target.
    MakeTable: cmake_check_build_system
    $(MAKE) -f CMakeFiles/Makefile2 MakeTable
    .PHONY : MakeTable
    再看Makefile2文件,找到出错时正在编译的目标。
    # All Build rule for target.
    MathFunctions/CMakeFiles/MakeTable.dir/all:
    $(MAKE) -f MathFunctions/CMakeFiles/MakeTable.dir/build.make MathFunctions/CMakeFiles/MakeTable.dir/depend
    $(MAKE) -f MathFunctions/CMakeFiles/MakeTable.dir/build.make MathFunctions/CMakeFiles/MakeTable.dir/build
    $(CMAKE_COMMAND) -E cmake_progress_report D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step5/build/CMakeFiles 1
    @echo "Built target MakeTable"
    .PHONY : MathFunctions/CMakeFiles/MakeTable.dir/all
    Make规则的执行顺序是按照命令的先后顺序:
    如果Makefile内容如下:
    all:
    echo "First line."
    echo "Second line."
    那么make结果:
    D:/Users/Desktop>make
    echo "First line."
    First line.
    echo "Second line."
    Second line.
    由此,Built target MakeTable输出之后才失败的。

    6、Step6
    生成各种平台Windows/Ubuntu/etc.上的安装包,包括二进制安装包和源码安装包。
    可以把依赖的系统库也打包。include (InstallRequiredSystemLibraries)
    使用CPack。
    由于Step1-7,后面一步的配置都包含了前面一步的配置,所以从Step5开始,就会遇到make的问题。
    为了编译通过,可以修改MathFunctions目录下的CMakeLists.txt和mysqrt.cxx,去掉所有对Table.h 的依赖。
    运行make package可以生成安装包:
    第一次,因为没有安装nsis,提示如下问题:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package
    [ 50%] "Built target MathFunctions"
    [100%] "Built target Tutorial"
    Run CPack packaging tool...
    CPack Error: Cannot find NSIS registry value. This is usually caused by NSIS not
    being installed. Please install NSIS from http://nsis.sourceforge.net
    CPack Error: Cannot initialize the generator NSIS
    make: *** [package] Error 1
    安装NSIS之后,运行成功:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package
    [ 50%] "Built target MathFunctions"
    [100%] "Built target Tutorial"
    Run CPack packaging tool...
    CPack: Create package using NSIS
    CPack: Install projects
    CPack: - Run preinstall target for: Tutorial
    CPack: - Install project: Tutorial
    CPack: Compress package
    CPack: Finalize package
    CPack: Package D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build/T
    utorial-1.0.1-win32.exe generated.
    生成了如下的Windows安装包文件:
    安装完成后,还可以很方便的卸载它:
    运行make package_source可以产生源代码包。(我的电脑上提示找不到合适的zip程序)
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package_sou
    rce
    Run CPack packaging tool for source...
    CPack Error: Cannot find a suitable ZIP program
    CPack Error: Cannot initialize the generator ZIP
    make: *** [package_source] Error 1
    7、Step7
    把结果发布到dashboard。
    下面网址是一个公开的dashboard:
    http://www.cdash.org/CDash/index.php?project=PublicDashboard
    dashboard上显示的项目名称通过如下方式设置:
    需要先把cmake/bin目录加入path中,然后执行ctest -D Experimental。这里遇到了一个错误。
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build>ctest -D Experim
    ental
    Site: JELLY-PC2
    Build name: Win32-make
    Create new tag: 20100521-1833 - Experimental
    Configure project
    Each . represents 1024 bytes of output
    . Size of output: 0K
    Build project
    Each symbol represents 1024 bytes of output.
    '!' represents an error and '*' a warning.
    . Size of output: 0K
    0 Compiler errors
    0 Compiler warnings
    Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build
    Start 1: TutorialRuns
    1/9 Test #1: TutorialRuns ..................... Passed 0.01 sec
    Start 2: TutorialUsage
    2/9 Test #2: TutorialUsage .................... Passed 0.01 sec
    Start 3: TutorialComp4
    3/9 Test #3: TutorialComp4 .................... Passed 0.01 sec
    Start 4: TutorialComp9
    4/9 Test #4: TutorialComp9 .................... Passed 0.01 sec
    Start 5: TutorialComp5
    5/9 Test #5: TutorialComp5 .................... Passed 0.01 sec
    Start 6: TutorialComp7
    6/9 Test #6: TutorialComp7 .................... Passed 0.01 sec
    Start 7: TutorialComp25
    7/9 Test #7: TutorialComp25 ................... Passed 0.01 sec
    Start 8: TutorialComp-25
    8/9 Test #8: TutorialComp-25 .................. Passed 0.01 sec
    Start 9: TutorialComp0.0001
    9/9 Test #9: TutorialComp0.0001 ............... Passed 0.01 sec
    100% tests passed, 0 tests failed out of 9
    Total Test time (real) = 0.19 sec
    Performing coverage
    Cannot find any coverage files. Ignoring Coverage request.
    Submit files (using http)
    Using HTTP submit method
    Drop site:http://
    Error when uploading file: D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutoria
    l/Step7/build/Testing/20100521-1833/Build.xml
    Error message was: couldn't connect to host
    Problems when submitting via HTTP
    Errors while running CTest
    产生了如下一些文件:
     
     
     
    没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



       本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6215106.html,如需转载请自行联系原作者


    展开全文
  • cmake使用教程

    2020-12-16 13:11:31
    今天上班使用cmake,以头闷啊!都是一直添加makefile,现在需要自己写cmake,于是乎,在百度中找到下面教程。让我顺利读懂了cmake 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    今天上班使用到cmake,以头闷啊!都是一直添加makefile,现在需要自己写cmake,于是乎,在百度中找到下面教程。让我顺利读懂了cmake

    。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

     
     

    CMake入门教程

    参考文献:http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html

    官方网址:http://www.cmake.org/

    下载网址:http://www.cmake.org/download/

    当前版本:3.1rc3

    本文基于CMake 2.8版本编写。

    CMake 是一个跨平台的,开源的构建系统(BuildSystem)。CMake 可以通过 CMakeLists.txt 文件来产生特定平台的标准的构建文件,例如:为 Unix 平台生成makefiles文件(使用GCC编译),为 Windows MSVC 生成 projects/workspaces(使用VS IDE编译)或Makefile文件(使用nmake编译)。

    CMake Hello World

    首先编写一个简单的程序(hello.cpp):

    #include <stdio.h>

    int main()

    {

       printf("Hello World");

       return 0;

    }

    编写CMakeLists.txt,并与hello.cpp放在同一个目录。

    project(hello)

    cmake_minimum_required(VERSION 2.8)

    aux_source_directory(. DIR_SRCS)

    add_executable(hello ${DIR_SRCS})

    在 CMakeLists.txt 所在的目录下创建一个build目录,进入该目录执行 CMake 命令生成构建文件:

    打开Visual Studio 2008命令行提示窗口,它会执行加载一些VS的环境变量。

    mkdir build

    cd build

    cmake -G "NMake Makefiles" ../

    -- The C compiler identification is MSVC 15.0.30729.1

    -- The CXX compiler identification is MSVC15.0.30729.1

    ….

    -- Detecting CXX compiler ABI info

    -- Detecting CXX compiler ABI info - done

    -- Configuring done

    -- Generating done

    -- Build files have been written to:I:/cmake-hello/build

    这里使用的平台为 Windows 并且安装了 VS2008,CMake 为我们生成了 VS2008的构建文件Makefile,我们可以使用nmake来构建应用程序,执行:

    nmake

     

    Microsoft (R) Program Maintenance UtilityVersion 9.00.30729.01

    Copyright (C) Microsoft Corporation.  All rights reserved.

     

    Scanning dependencies of target hello

    [100%] Building CXX objectCMakeFiles/hello.dir/hello.cpp.obj

    hello.cpp

    Linking CXX executable hello.exe

    [100%] Built target hello

    编译成功完成后,会当前目录下生成hello应用程序。

    CMake基本语法

    编写的CMakeLists.txt需要符合一定的语法规则,它主要由CMake命令组成。

    1)注释的语法:在CMake中注释使用#字符开始到此行结束。

    2)CMake命令:命令不区分大小写(参数会区分大小写),命令由命令、参数列表组成,参数之间使用空格进行分隔。使用一对双引号包括的字符串认为是一个参数。命令可以是一个内置命令(例如:project,add_executable等),也可以是一个用户定义的宏(macro)或者函数(function)。

    3)数据类型:CMake的基本数据类型是字符串,一组字符串在一起称为列表(list),例如:

    # 通过 set 命令构建一个 listVAR

    set(VAR a b c)

    使用语法 ${VariableName} 来访问名字为 VariableName 的变量的值(变量名区分大小写)。需要注意的是,即使在字符串中也可以使用 ${VariableName} 来访问变量的值:

    set(VAR a b c)

    # 输出 VAR = a;b;c

    message("VAR = ${VAR}")

    使用语法 $ENV{VariableName} 来访问环境变量的值(ENV{VariableName} 则表示环境变量本身)

    # 输出环境变量 PATH 的值

    message($ENV{PATH})

    4)条件控制和循环结构

    条件控制命令为 if 命令

    if(expression)

        #...

    elseif(expression2)

        #...

    else()

        #...

    endif()

    对于 if(string) 来说:

    如果 string 为(不区分大小写)1、ON、YES、TRUE、Y、非 0 的数则表示真

    如果 string 为(不区分大小写)0、OFF、NO、FALSE、N、IGNORE、空字符串、以 -NOTFOUND 结尾的字符串则表示假

    如果 string 不符合上面两种情况,则 string 被认为是一个变量的名字。变量的值为第二条所述的各值则表示假,否则表示真。

    # 此策略(Policy)在 CMake2.8.0 才被引入

    # 因此这里需要指定最低 CMake 版本为 2.8

    cmake_minimum_required(VERSION 2.8)

    set(YES 0)

     

    # 输出 True

    if(YES)

       message(True)

    else()

       message(False)

    endif()

     

    # 输出 False

    if(${YES})

       message(True)

    else()

       message(False)

    endif()

    表达式中可以包含操作符,操作符包括:

    一元操作符,例如:EXISTS、COMMAND、DEFINED 等

    二元操作符,例如:EQUAL、LESS、GREATER、STRLESS、STRGREATER 等

    NOT(非操作符)

    AND(与操作符)、OR(或操作符)

    操作符优先级:一元操作符 > 二元操作符 > NOT > AND、OR

    常用操作符介绍:

    if(NOT expression)

    为真的前提是 expression 为假

    if(expr1 AND expr2)

    为真的前提是 expr1 和 expr2 都为真

    if(expr1 OR expr2)

    为真的前提是 expr1 或者 expr2 为真

    if(COMMAND command-name)

    为真的前提是存在 command-name 命令、宏或函数且能够被调用

    if(EXISTS name)

    为真的前提是存在 name 的文件或者目录(应该使用绝对路径)

    if(file1 IS_NEWER_THAN file2)

    为真的前提是 file1 比 file2 新或者 file1、file2 中有一个文件不存在(应该使用绝对路径)

    if(IS_DIRECTORY directory-name)

    为真的前提是 directory-name 表示的是一个目录(应该使用绝对路径)

    if(variable|string MATCHES regex)

    为真的前提是变量值或者字符串匹配 regex 正则表达式

    if(variable|string LESS variable|string)

    if(variable|string GREATER variable|string)

    if(variable|string EQUAL variable|string)

    为真的前提是变量值或者字符串为有效的数字且满足小于(大于、等于)的条件

    if(variable|string STRLESS variable|string)

    if(variable|string STRGREATERvariable|string)

    if(variable|string STREQUALvariable|string)

    为真的前提是变量值或者字符串以字典序满足小于(大于、等于)的条件

    if(DEFINED variable)

    为真的前提是 variable 表示的变量被定义了。

    foreach 循环范例:

    set(VAR a b c)

    foreach(f ${VAR})

       message(${f})

    endforeach()

    while 循环范例:

    set(VAR 5)

    while(${VAR} GREATER 0)

       message(${VAR})

       math(EXPR VAR "${VAR} - 1")

    endwhile()

    5)函数和宏定义

    函数会为变量创建一个局部作用域,而宏则使用全局作用域。范例:

    # 定义一个宏 hello

    macro(hello MESSAGE)

       message(${MESSAGE})

    endmacro()

    # 调用宏 hello

    hello("hello world")

    # 定义一个函数 hello

    function(hello MESSAGE)

       message(${MESSAGE})

    endfunction()

    函数和宏可以通过命令 return() 返回,但是函数和宏的返回值必须通过参数传递出去。例如:

    cmake_minimum_required(VERSION 2.8)

    function(get_func RESULT)

        #RESULT 的值为实参的值,因此需要使用 ${RESULT}

        #这里使用 PARENT_SCOPE 是因为函数会构建一个局部作用域

       set(${RESULT} "Hello Function" PARENT_SCOPE)

    endfunction()

     

    macro(get_macro RESULT)

       set(${RESULT} "Hello Macro")

    endmacro()

     

    get_func(V1)

    # 输出 Hello Function

    message(${V1})

     

    get_macro(V2)

    # 输出 Hello Macro

    message(${V2})

    7)字符串的一些问题

    字符串可跨行且支持转移字符,例如:

    set(VAR "hello

    world")

    # 输出结果为:

    # ${VAR} = hello

    # world

    message("\${VAR} = ${VAR}")

    CMake常用命令

    这里介绍一下常用的命令(CMake 2.8 的命令可以在此查询):

    http://www.cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands

    1)project 命令

    命令语法:project(<projectname> [languageName1 languageName2 … ] )

    命令简述:用于指定项目的名称

    使用范例:project(Main)

    2)cmake_minimum_required命令

    命令语法:cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]][FATAL_ERROR])

    命令简述:用于指定需要的 CMake 的最低版本

    使用范例:cmake_minimum_required(VERSION 2.8)

    3)aux_source_directory命令

    命令语法:aux_source_directory(<dir> <variable>)

    命令简述:用于将 dir 目录下的所有源文件的名字保存在变量 variable 中

    使用范例:aux_source_directory(. DIR_SRCS)

    4)add_executable 命令

    命令语法:add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)

    命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 name

    使用范例:add_executable(Main ${DIR_SRCS})

    5)add_library 命令

    命令语法:add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)

    命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为 name

    使用范例:add_library(Lib ${DIR_SRCS})

    6)add_dependencies 命令

    命令语法:add_dependencies(target-name depend-target1 depend-target2 …)

    命令简述:用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。这里的目标必须是 add_executable、add_library、add_custom_target 命令创建的目标

    7)add_subdirectory 命令

    命令语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

    命令简述:用于添加一个需要进行构建的子目录

    使用范例:add_subdirectory(Lib)

    8)target_link_libraries命令

    命令语法:target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)

    命令简述:用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)

    使用范例:target_link_libraries(Main Lib)

    9)set 命令

    命令语法:set(<variable> <value> [[CACHE <type><docstring> [FORCE]] | PARENT_SCOPE])

    命令简述:用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache(缓存)中。

    使用范例:set(ProjectName Main)

    10)unset 命令

    命令语法:unset(<variable> [CACHE])

    命令简述:用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除。

    使用范例:unset(VAR CACHE)

    11)message 命令

    命令语法:message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message todisplay”…)

    命令简述:用于输出信息

    使用范例:message(“Hello World”)

    12)include_directories 命令

    命令语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

    命令简述:用于设定目录,这些设定的目录将被编译器用来查找 include 文件

    使用范例:include_directories(${PROJECT_SOURCE_DIR}/lib)

    13)find_path 命令

    命令语法:find_path(<VAR> name1 [path1 path2 …])

    命令简述:用于查找包含文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。默认的情况下,VAR 会被保存在 Cache 中,这时候我们需要清除 VAR 才可以进行下一次查询(使用 unset 命令)。

    使用范例:

    find_path(LUA_INCLUDE_PATH lua.h${LUA_INCLUDE_FIND_PATH})

    if(NOT LUA_INCLUDE_PATH)

       message(SEND_ERROR "Header file lua.h not found")

    endif()

    14)find_library 命令

    命令语法:find_library(<VAR> name1 [path1 path2 …])

    命令简述:用于查找库文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),如果没有找到则结果为 <VAR>-NOTFOUND。一个类似的命令 link_directories 已经不太建议使用了

    15)add_definitions 命令

    命令语法:add_definitions(-DFOO -DBAR …)

    命令简述:用于添加编译器命令行标志(选项),通常的情况下我们使用其来添加预处理器定义

    使用范例:add_definitions(-D_UNICODE -DUNICODE)

    16)execute_process 命令

    命令语法:

    execute_process(COMMAND <cmd1>[args1...]]

                      [COMMAND <cmd2>[args2...] [...]]

                      [WORKING_DIRECTORY<directory>]

                      [TIMEOUT <seconds>]

                      [RESULT_VARIABLE<variable>]

                      [OUTPUT_VARIABLE<variable>]

                      [ERROR_VARIABLE<variable>]

                      [INPUT_FILE <file>]

                      [OUTPUT_FILE <file>]

                      [ERROR_FILE <file>]

                      [OUTPUT_QUIET]

                      [ERROR_QUIET]

                     [OUTPUT_STRIP_TRAILING_WHITESPACE]

                     [ERROR_STRIP_TRAILING_WHITESPACE])

    命令简述:用于执行一个或者多个外部命令。每一个命令的标准输出通过管道转为下一个命令的标准输入。WORKING_DIRECTORY 用于指定外部命令的工作目录,RESULT_VARIABLE 用于指定一个变量保存外部命令执行的结果,这个结果可能是最后一个执行的外部命令的退出码或者是一个描述错误条件的字符串,OUTPUT_VARIABLE 或者 ERROR_VARIABLE 用于指定一个变量保存标准输出或者标准错误,OUTPUT_QUIET 或者 ERROR_QUIET 用于忽略标准输出和标准错误。

    使用范例:execute_process(COMMAND ls)

    18)file 命令

    命令简述:此命令提供了丰富的文件和目录的相关操作(这里仅说一下比较常用的)

    使用范例:

    # 目录的遍历

    # GLOB 用于产生一个文件(目录)路径列表并保存在variable 中

    # 文件路径列表中的每个文件的文件名都能匹配globbing expressions(非正则表达式,但是类似)

    # 如果指定了 RELATIVE 路径,那么返回的文件路径列表中的路径为相对于 RELATIVE 的路径

    # file(GLOB variable [RELATIVE path][globbing expressions]...)

     

    # 获取当前目录下的所有的文件(目录)的路径并保存到 ALL_FILE_PATH 变量中

    file(GLOB ALL_FILE_PATH ./*)

    # 获取当前目录下的 .h 文件的文件名并保存到ALL_H_FILE 变量中

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

    file(GLOB ALL_H_FILE RELATIVE${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/*.h)

    CMake常用变量

    UNIX 如果为真,表示为 UNIX-like 的系统,包括 AppleOS X 和 CygWin

    WIN32 如果为真,表示为 Windows 系统,包括 CygWin

    APPLE 如果为真,表示为 Apple 系统

    CMAKE_SIZEOF_VOID_P 表示 void* 的大小(例如为 4 或者 8),可以使用其来判断当前构建为 32 位还是 64 位

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

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

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

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

    构建类型

    CMake 为我们提供了四种构建类型:

    Debug

    Release

    MinSizeRel

    RelWithDebInfo

    如果使用 CMake 为 Windows MSVC 生成 projects/workspaces 那么我们将得到上述的 4 种解决方案配置。

     

    如果使用 CMake 生成 Makefile 时,我们需要做一些不同的工作。CMake 中存在一个变量 CMAKE_BUILD_TYPE 用于指定构建类型,此变量只用于基于 make 的生成器。我们可以这样指定构建类型:

    $ CMake -DCMAKE_BUILD_TYPE=Debug .

    这里的 CMAKE_BUILD_TYPE 的值为上述的 4 种构建类型中的一种。

    编译和链接标志

    C 编译标志相关变量:

     

    CMAKE_C_FLAGS

    CMAKE_C_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]

    C++ 编译标志相关变量:

     

    CMAKE_CXX_FLAGS

    CMAKE_CXX_FLAGS_[DEBUG|RELEASE|MINSIZEREL|RELWITHDEBINFO]

    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]

    它们类似于编译标志相关变量

    生成Debug和Release版本

    在 Visual Studio 中我们可以生成 debug 版和 release 版的程序,使用 CMake 我们也可以达到上述效果。debug 版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而 release 版的不需要调试信息但需要优化。这些特性在 gcc/g++ 中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是 -O0 即不做优化;添加调试信息的参数是 -g -ggdb ,如果不添加这个参数,调试信息就不会被包含在生成的二进制文件中。

    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。

    示例:

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

    第 5 和 6 行设置了两个变量 CMAKE_CXX_FLAGS_DEBUG 和CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项。编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 "ccmake ." 进入一个图形化界面。

    编译32位和64位程序

    对于 Windows MSVC,我们可以设定 CMake Generator 来确定生成 Win32 还是 Win64 工程文件,例如:

     

    # 用于生成 Visual Studio 10Win64 工程文件

    CMake -G "Visual Studio 10 Win64"

    # 用于生成 Visual Studio 10Win32 工程文件

    CMake -G "Visual Studio 10"

    我们可以通过 CMake --help 来查看当前平台可用的 Generator。

    CMake .. -DUSE_32BITS=1

    if(USE_32BITS)

     message(STATUS "Using 32bits")

     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-m32")

     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-m32")

    else()

    endif(USE_32BITS)

    对于 UNIX 和类 UNIX 平台,我们可以通过编译器标志(选项)来控制进行 32 位还是 64 位构建。

    GCC命令行参数

    32位版:加上 -m32 参数,生成32位的代码。

    64位版:加上 -m64 参数,生成64位的代码。

    debug版:加上 -g 参数,生成调试信息。

    release版:加上 -static 参数,进行静态链接,使程序不再依赖动态库。加上 -O3 参数,进行最快速度优化。加上-DNDEBUG参数,定义NDEBUG宏,屏蔽断言。

    当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码,但某些编译器存在例外,例如——

    32位Linux下的GCC,默认是编译为32位代码。

    64位Linux下的GCC,默认是编译为64位代码。

    Window系统下的MinGW,总是编译为32位代码。因为MinGW只支持32位代码。

    Window系统下的MinGW-w64(例如安装了TDM-GCC,选择MinGW-w64),默认是编译为64位代码,包括在32位的Windows系统下。

    Makefile文件中的示例:

    # [args] 生成模式. 0代表debug模式, 1代表release模式. makeRELEASE=1.

    ifeq ($(RELEASE),0)

       CFLAGS += -g

    else

        #release

       CFLAGS += -static -O3 -DNDEBUG

       LFLAGS += -static

    endif

    # [args] 程序位数. 32代表32位程序, 64代表64位程序, 其他默认. makeBITS=32.

    ifeq ($(BITS),32)

       CFLAGS += -m32

       LFLAGS += -m32

    else

        ifeq($(BITS),64)

           CFLAGS += -m64

           LFLAGS += -m64

       else

       endif

    endif

    多源文件目录的处理方式

    我们在每一个源码目录中都会放置一个 CMakeLists.txt 文件。我们现在假定有这么一个工程:

    HelloWorld

    |

    +------- Main.cpp

    |

    +------- CMakeLists.txt

    |

    +------- Lib

            |

            +------- Lib.cpp

            |

            +------- Lib.h

            |

            +------- CMakeLists.txt

    这里 Lib 目录下的文件将被编译为一个库。首先,我们看一下 Lib 目录下的 CMakeLists.txt 文件:

    aux_source_directory(. DIR_SRCS)

    add_library(Lib ${DIR_SRCS})

    然后,看一下 HelloWorld 目录下的 CMakeLists.txt 文件:

    project(Main)

    cmake_minimum_required(VERSION 2.8)

    add_subdirectory(Lib)

    aux_source_directory(. DIR_SRCS)

    add_executable(Main ${DIR_SRCS})

    target_link_libraries(Main Lib)

    这里使用了 add_subdirectory 指定了需要进行构建的子目录,并且使用了 target_link_libraries 命令,表示 Main 可执行文件需要链接 Lib库。我们执行 CMake . 命令,首先会执行 HelloWorld 目录下的 CMakeLists.txt 中的命令,当执行到 add_subdirectory(Lib) 命令的时候会进入 Lib 子目录并执行其中的CMakeLists.txt 文件。

    外部构建(out of source builds)

    我们在 CMakeLists.txt 所在目录下执行 CMake . 会生成大量的文件,这些文件和我们的源文件混在一起不好管理,我们采用外部构建的方式来解决这个问题。以上面的 Hello World 工程来做解释:

    在 HelloWorld 目录下建立一个build 目录(build目录可以建立在如何地方)

    进入 build 目录并进行外部构建 CMake ..(语法为 CMake <CMakeLists.txt 的路径>,这里使用 CMake.. 表明了 CMakeLists.txt 在 Build 目录的父目录中)。这样 CMake 将在 Build 目录下生成文件。

    展开全文
  • cmake 使用教程

    2017-06-29 09:52:13
    @(make & gcc&gdb) [cmake]cmake官方教程项目相关 文件相关 配置相关 文件安装 cmake 使用 6常用内置变量 cmake其高级功能 1 项目相关 指定项目名称? project(项目) 一个cmake 是否可以有多个项目:- 一个项目可以有...

    cmake官方教程

    1 项目相关

    1. 指定项目名称? project(项目)
    2. 一个cmake 是否可以有多个项目:- 一个项目可以有多个可执行文件。添加方法:add_executable(Tutorial tutorial.cxx)
    3. 如何创建库 add_library(MathFunctions mysqrt.cxx)
    4. include(文件) 包含其他的cmake文件

    2 文件相关

    1. 如何增加源文件
    2. 如何添加头文件 :include_directories("${PROJECT_BINARY_DIR}")
    3. 如何添加静态库和共享库 target_link_libraries (Tutorial MathFunctions)
    4. 递归添加目录:add_subdirectory (MathFunctions)

    3 配置相关

    1. 定义配置文件
      make target 自动生成配置文件
      自动生成配置文件。
    configure_file (
      "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
      "${PROJECT_BINARY_DIR}/TutorialConfig.h"
      )

    2 定义编译开关

    option (USE_MYMATH 
            "Use tutorial provided math implementation" ON)

    4 文件安装

    install (TARGETS MathFunctions DESTINATION bin)
    install (FILES MathFunctions.h DESTINATION include)

    5 cmake 使用

    camke cmakelist.txt存放目录 example:cmake .
    make test 执行使用CMake官方test框架

    6常用内置变量

    PROJECT_SOURCE_DIR
    PROJECT_BINARY_DIR

    7 cmake其高级功能

    1. 平台检查自省函数。CMake文件执行目录中由现成的CMake函数,用来支持自省。CMake自省函数
    2. CTest, CMake官方带的测试框架
    3. add_custom_command: 动态生成源文件(OUTPUT )、或者执行编译前后命令(TARGET)
     add_custom_command(OUTPUT output1 [output2 ...]
                         COMMAND command1 [ARGS] [args1...]
                         [COMMAND command2 [ARGS] [args2...] ...]
                         [MAIN_DEPENDENCY depend]
                         [DEPENDS [depends...]]
                         [IMPLICIT_DEPENDS <lang1> depend1 ...]
                         [WORKING_DIRECTORY dir]
                         [COMMENT comment] [VERBATIM] [APPEND]) 
    add_custom_command(TARGET target
                        PRE_BUILD | PRE_LINK | POST_BUILD
                        COMMAND command1 [ARGS] [args1...]
                        [COMMAND command2 [ARGS] [args2...] ...]
                        [WORKING_DIRECTORY dir]
                        [COMMENT comment] [VERBATIM])
    1. add_custom_target 添加自定义目标
    add_custom_target(Name [ALL] [command1 [args1...]]
                        [COMMAND command2 [args2...] ...]
                        [DEPENDS depend depend depend ... ]
                        [WORKING_DIRECTORY dir]
                        [COMMENT comment] [VERBATIM]
                        [SOURCES src1 [src2...]])
    1. CMake中自定义函数
     macro (do_test arg result)
      add_test (TutorialComp${arg} Tutorial ${arg})
      set_tests_properties (TutorialComp${arg}
        PROPERTIES PASS_REGULAR_EXPRESSION ${result}
        )
    endmacro (do_test)
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,130
精华内容 452
关键字:

cmake使用教程