精华内容
下载资源
问答
  • Cmake

    2021-03-08 13:05:40
    cmakecmake例子一cmake 语法cmake命令例子二例子三例子四例子五例子六感谢dbzhang800博主 cmake 最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 ...

    cmake

    • 最大的Qt4程序群(KDE4)采用cmake作为构建系统
    • Qt4的python绑定(pyside)采用了cmake作为构建系统
    • 开源的图像处理库 opencv 采用cmake 作为构建系统

    看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看:

    例子一

    一个经典的C程序,如何用cmake来进行构建程序呢?

    //main.c
    #include <stdio.h>
    int main()
    {
        printf("Hello World!/n");
        return 0;
    }
    

    编写一个 CMakeList.txt 文件(可看做cmake的工程文件):

    project(HELLO)
    set(SRC_LIST main.c)
    add_executable(hello ${SRC_LIST})
    

    然后,建立一个任意目录(比如本目录下创建一个build子目录),在该build目录下调用cmake

    注意:为了简单起见,我们从一开始就采用cmake的 out-of-source
    方式来构建(即生成中间产物与源代码分离),并始终坚持这种方法,这也就是此处为什么单独创建一个目录,然后在该目录下执行 cmake 的原因

    mkdir build
    cmake ..
    make
    

    即可生成可执行程序 hello(.exe)
    目录结构

    +
    | 
    +--- main.c
    +--- CMakeList.txt
    |
    /--+ build/
       |
       +--- hello.exe
    

    cmake 真的不太好用哈,使用cmake的过程,本身也就是一个编程的过程,只有多练才行。
    我们先看看:前面提到的这些都是什么呢?
    CMakeList.txt
    第一行 project 不是强制性的,但最好始终都加上。这一行会引入两个变量

    HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR
    同时,cmake自动定义了两个等价的变量
    PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
    因为是out-of-source方式构建,所以我们要时刻区分这两个变量对应的目录
    可以通过message来输出变量的值

    message(${PROJECT_SOURCE_DIR})
    

    cmake 语法

     set 命令用来设置变量 
     add_exectuable 告诉工程生成一个可执行文件。 
     add_library 则告诉生成一个库文件。
    

    注意:CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。

    cmake命令

    cmake 命令后跟一个路径(…),用来指出 CMakeList.txt 所在的位置。
    由于系统中可能有多套构建环境,我们可以通过-G来制定生成哪种工程文件,通过 cmake -h 可得到详细信息。
    要显示执行构建过程中详细的信息(比如为了得到更详细的出错信息),可以在CMakeList.txt内加入:
    SET( CMAKE_VERBOSE_MAKEFILE on )
    或者执行make时
    $ make VERBOSE=1
    或者
    $ export VERBOSE=1
    $ make

    例子二

    一个源文件的例子一似乎没什么意思,拆成3个文件再试试看:
    hello.h 头文件

    #ifndef DBZHANG_HELLO_
    #define DBZHANG_HELLO_
    void hello(const char* name);
    #endif //DBZHANG_HELLO_
    

    hello.c

    #include <stdio.h>
    #include "hello.h"
    
    void hello(const char * name)
    {
        printf ("Hello %s!/n", name);
    }
    

    main.c

    #include "hello.h"
    int main()
    {
        hello("World");
        return 0;
    }
    

    然后准备好CMakeList.txt 文件

    project(HELLO)
    set(SRC_LIST main.c hello.c)
    add_executable(hello ${SRC_LIST})
    

    执行cmake的过程同上,目录结构

    +
    | 
    +--- main.c
    +--- hello.h
    +--- hello.c
    +--- CMakeList.txt
    |
    /--+ build/
       |
       +--- hello.exe
    

    例子很简单,没什么可说的

    例子三

    接前面的例子,我们将 hello.c 生成一个库,然后再使用会怎么样?
    改写一下前面的CMakeList.txt文件试试:

    project(HELLO)
    set(LIB_SRC hello.c)
    set(APP_SRC main.c)
    add_library(libhello ${LIB_SRC})
    add_executable(hello ${APP_SRC})
    target_link_libraries(hello libhello)
    

    和前面相比,我们添加了一个新的目标 libhello,并将其链接进hello程序
    然后想前面一样,运行cmake,得到

    +
    | 
    +--- main.c
    +--- hello.h
    +--- hello.c
    +--- CMakeList.txt
    |
    /--+ build/
       |
       +--- hello.exe
       +--- libhello.lib
    

    里面有一点不爽,对不?

    • 因为我的可执行程序(add_executable)占据了 hello 这个名字,所以 add_library 就不能使用这个名字了
    • 然后,我们去了个libhello 的名字,这将导致生成的库为 libhello.lib(或 liblibhello.a),很不爽
    • 想生成hello.lib(或libhello.a) 怎么办?

    添加一行

    set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
    

    例子四

    在前面,我们成功地使用了库,可是源代码放在同一个路径下,还是不太正规,怎么办呢?分开放呗
    我们期待是这样一种结构

    +
    |
    +--- CMakeList.txt
    +--+ src/
    |  |
    |  +--- main.c
    |  /--- CMakeList.txt
    |
    +--+ libhello/
    |  |
    |  +--- hello.h
    |  +--- hello.c
    |  /--- CMakeList.txt
    |
    /--+ build/
    

    哇,现在需要3个CMakeList.txt 文件了,每个源文件目录都需要一个,还好,每一个都不是太复杂
    顶层的CMakeList.txt 文件

    project(HELLO)
    add_subdirectory(src)
    add_subdirectory(libhello)
    

    src 中的 CMakeList.txt 文件

    include_directories(${PROJECT_SOURCE_DIR}/libhello)
    set(APP_SRC main.c)
    add_executable(hello ${APP_SRC})
    target_link_libraries(hello libhello)
    

    libhello 中的 CMakeList.txt 文件

    set(LIB_SRC hello.c)
    add_library(libhello ${LIB_SRC})
    set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
    

    恩,和前面一样,建立一个build目录,在其内运行cmake,然后可以得到

    build/src/hello.exe
    build/libhello/hello.lib
    

    回头看看,这次多了点什么,顶层的 CMakeList.txt 文件中使用 add_subdirectory 告诉cmake去子目录寻找新的CMakeList.txt 子文件
    在 src 的 CMakeList.txt 文件中,新增加了include_directories,用来指明头文件所在的路径。

    例子五

    前面还是有一点不爽:如果想让可执行文件在 bin 目录,库文件在 lib 目录怎么办?
    就像下面显示的一样:

     + build/
       |
       +--+ bin/
       |  |
       |  /--- hello.exe
       |
       /--+ lib/
          |
          /--- hello.lib
    

    一种办法:修改顶级的 CMakeList.txt 文件

    project(HELLO)
    add_subdirectory(src bin)
    add_subdirectory(libhello lib)
    

    不是build中的目录默认和源代码中结构一样么,我们可以指定其对应的目录在build中的名字。
    这样一来:build/src 就成了 build/bin 了,可是除了 hello.exe,中间产物也进来了。还不是我们最想要的。
    另一种方法:不修改顶级的文件,修改其他两个文件
    src/CMakeList.txt 文件

    include_directories(${PROJECT_SOURCE_DIR}/libhello)
    #link_directories(${PROJECT_BINARY_DIR}/lib)
    set(APP_SRC main.c)
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    add_executable(hello ${APP_SRC})
    target_link_libraries(hello libhello)
    

    libhello/CMakeList.txt 文件

    set(LIB_SRC hello.c)
    add_library(libhello ${LIB_SRC})
    set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
    

    例子六

    在例子三至五中,我们始终用的静态库,那么用动态库应该更酷一点吧。 试着写一下

    如果不考虑windows下,这个例子应该是很简单的,只需要在上个例子的 libhello/CMakeList.txt 文件中的add_library命令中加入一个SHARED参数:

    add_library(libhello SHARED ${LIB_SRC})
    

    可是,我们既然用cmake了,还是兼顾不同的平台吧,于是,事情有点复杂:
    修改 hello.h 文件

    #ifndef DBZHANG_HELLO_
    #define DBZHANG_HELLO_
    #if defined _WIN32
        #if LIBHELLO_BUILD
            #define LIBHELLO_API __declspec(dllexport)
        #else
            #define LIBHELLO_API __declspec(dllimport)
        #endif
    #else
        #define LIBHELLO_API
    #endif
    LIBHELLO_API void hello(const char* name);
    #endif //DBZHANG_HELLO_
    

    修改 libhello/CMakeList.txt 文件

    set(LIB_SRC hello.c)
    add_definitions("-DLIBHELLO_BUILD")
    add_library(libhello SHARED ${LIB_SRC})
    set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
    

    感谢dbzhang800博主

    版权声明:本文为CSDN博主「dbzhang800」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/dbzhang800/article/details/6314073

    展开全文
  • cmake

    2020-12-31 01:21:01
    它允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,再根据用户的平台生成所需的本地化 Makefile 和工程文件,从而做到“Write once, run everywhere”。 比如在 linux 平台: 先编写 CMake

    阅读文章

    背景

    不同的Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。为了保证能够在不同平台编译,就得为每一种标准写一次 Makefile ,麻烦。

    CMake诞生了。CMake 是比make 更高级的编译配置工具。它允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,再根据用户的平台生成所需的本地化 Makefile 和工程文件,从而做到“Write once, run everywhere”。

    比如在 linux 平台:

    1. 先编写 CMake 配置文件 CMakeLists.txt 。
    2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile(ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。PATH 是 CMakeLists.txt 所在的目录。)
    3. 用 make 命令进行编译。

    具体案例:

    1、同一目录,单个源文件

    只有一个源文件 main.cc ,在同个目录下编写CMakeList.txt 文件内容如下:
    在这里插入图片描述
    add_executable: 将名为 main.cc 的源文件编译成一个名称为 Demo 的可执行文件。

    2、同一目录,多个源文件

    在这里插入图片描述

    简单方案一:

    在这里插入图片描述
    在 add_executable 命令中增加了一个 MathFunctions.cc 源文件就行

    但是如果源文件很多的时候,一个个加很麻烦,于是有了方案二

    方案二:

    在这里插入图片描述
    使用 aux_source_directory 命令,该命令会查找指定目录下的源文件,然后将结果存进指定变量名。其语法如下:

    aux_source_directory(<dir> <variable>)
    #上面案例中.对应这里的<dir>就是表示所有源文件名称都保存到该变量哈
    

    3、多个目录,多个源文件,对应多个CMakeLists.txt 文件

    在这里插入图片描述
    需要分别在项目根目录 Demo3 和 math 目录里各编写一个 CMakeLists.txt 文件。

    根目录中的 CMakeLists.txt :
    在这里插入图片描述
    命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。
    命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库(先将 math 目录里的文件编译成静态库再由 main 函数调用。)

    子目录中的 CMakeLists.txt:
    在这里插入图片描述
    命令 add_library 将 src 目录中的源文件编译为静态链接库。

    4、自定义编译选项

    CMake 允许为项目增加编译选项,从而根据用户的环境和需求选择最合适的编译方案。
    例如,将 MathFunctions 库设为可选的库,如果该选项为 ON ,就使用该库定义的数学函数来进行运算。否则就调用标准库中的数学函数库。

    1、第一步是在顶层的 CMakeLists.txt 文件中添加该选项:

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
    
    # 项目信息
    project (Demo4)
    
    # 加入一个配置头文件,用于处理 CMake 对源码的设置
    configure_file (
      "${PROJECT_SOURCE_DIR}/config.h.in"
      "${PROJECT_BINARY_DIR}/config.h"
      )
    
    # 是否使用自己的 MathFunctions 库
    option (USE_MYMATH
           "Use provided math implementation" ON)
    
    # 是否加入 MathFunctions 库
    if (USE_MYMATH)
      include_directories ("${PROJECT_SOURCE_DIR}/math")
      add_subdirectory (math)  
      set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
    endif (USE_MYMATH)
    
    # 查找当前目录下的所有源文件
    # 并将名称保存到 DIR_SRCS 变量
    aux_source_directory(. DIR_SRCS)
    
    # 指定生成目标
    add_executable(Demo ${DIR_SRCS})
    target_link_libraries (Demo  ${EXTRA_LIBS})
    
    

    configure_file 命令用于加入一个配置头文件 config.h ,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将可以通过预定义一些参数和变量来控制代码的生成。

    option 命令添加了一个 USE_MYMATH 变量,并且默认值为 ON ,接下来的命令是根据 USE_MYMATH 变量的值来决定是否使用我们自己编写的 MathFunctions 库。

    2、修改 main.cc 文件
    修改 main.cc 文件,根据 USE_MYMATH 的预定义值来决定是调用标准库还是 MathFunctions 库:

    #include <stdio.h>
    #include <stdlib.h>
    #include "config.h"
    
    #ifdef USE_MYMATH
      #include "math/MathFunctions.h"
    #else
      #include <math.h>
    #endif
    
    
    int main(int argc, char *argv[])
    {
        if (argc < 3){
            printf("Usage: %s base exponent \n", argv[0]);
            return 1;
        }
        double base = atof(argv[1]);
        int exponent = atoi(argv[2]);
        
    #ifdef USE_MYMATH
        printf("Now we use our own Math library. \n");
        double result = power(base, exponent);
    #else
        printf("Now we use the standard library. \n");
        double result = pow(base, exponent);
    #endif
        printf("%g ^ %d is %g\n", base, exponent, result);
        return 0;
    }
    

    这里的 config.h 文件预定义了 USE_MYMATH 的值。但并不直接编写这个文件,为了方便从 CMakeLists.txt 中导入配置,我们编写一个 config.h.in 文件,内容如下:#cmakedefine USE_MYMATH然后CMake 会自动根据 CMakeLists 配置文件中的设置自动生成 config.h 文件。

    5、补充细节————安装和测试

    CMake 也可以用来指定安装规则,添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行。在以前的 GNU Makefile 里,你可能需要为此编写 install 和 test 两个伪目标和相应的规则,但在 CMake 里,这样的工作同样只需要以下简单的调用几条命令。

    5.1 定制安装规则
    先在 math/CMakeLists.txt 文件里添加下面两行:

    # 指定 MathFunctions 库的安装路径
    install (TARGETS MathFunctions DESTINATION bin)
    install (FILES MathFunctions.h DESTINATION include)
    

    再修改根目录的 CMakeLists 文件,在末尾添加下面几行:

    # 指定安装路径
    install (TARGETS Demo DESTINATION bin)
    install (FILES "${PROJECT_BINARY_DIR}/config.h"
             DESTINATION include)
    

    然后生成的 Demo 文件和 MathFunctions 函数库 libMathFunctions.o 文件将会自动被复制到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件则会被复制到 /usr/local/include 中(这里的 /usr/local/ 是默认安装到的根目录,可以修改 CMAKE_INSTALL_PREFIX 变量的值来指定这些文件应该拷贝到哪个根目录)

    5.2 为工程添加测试
    CMake 提供了一个称为 CTest 的测试工具。在项目根目录的 CMakeLists 文件中调用一系列的 add_test 命令即可

    展开全文
  • cmake开发实战教程前言一、cmake中函数CMAKE_MINIMUM_REQUIREDSETPROJECTIF/ELSE/ENDIFPROJECT_SOURCE_DIRMESSAGELINK_DIRECTORIESCMAKE_C_FLAGS/CMAKE_CXX_FLAGSADD_DEFINITIONSCMAKE_CL_64INCLUDE_...

    前言

    	开发中经常会使用到Qt,VS,有时候,还会遇到跨平台的开发,虽然qmake也能满足跨平台。但是使用cmake
    配置起来更简单,下面分别将各个cmake中的用法。当然,这篇博客的目的是能够直接通过cmake模板来开发项目,
    修改项目。
    

    一、cmake中函数

    CMAKE_MINIMUM_REQUIRED

    cmake版本的最小要求
    CMAKE_MINIMUM_REQUIRED(VERSION 3.10.0)
    cmake最小版本3.10.0,cmake不能低于VERSION 定义的版本(本初是3.10.0)
    

    SET

    SET  用变量代替值
    例如 SET(PRJ_NAME hello)
    设置PRJ_NAME为hello
    

    PROJECT

    PROJECT(${PRJ_NAME})
    	通过上面的SET PRJ_NAME,后面只要将SET(PRJ_NAME hello)中的hello替换,不影响整个工程,后面
    需要用到PRJ_NAME时,只要修改SET(PRJ_NAME hello)这一句就可以了。
    

    IF/ELSE/ENDIF

    IF(WIN32)
    	SET(CMAKE_DEBUG_POSTFIX "_d")
    ENDIF(WIN32)
    这一句是如果windows下,CMAKE_DEBUG_POSTFIX 设置生成debug后缀
    IF(WIN32)
    	# 如果是windows
    ELSE(WIN32)
    	# 非windows
    ENDIF(WIN32)
    

    PROJECT_SOURCE_DIR

    这个在模板中,只在根CMakeLists.txt中使用,这个表示你的CMakeLists.txt所在的根目录下
    

    MESSAGE

    为用户显示一条消息
    MESSAGE(STATUS ${PROJECT_BINARY_DIR})
    MESSAGE(STATUS ${CMAKE_BINARY_DIR})
    () = 重要消息;
    STATUS = 非重要消息;
    WARNING = CMake 警告, 会继续执行;
    AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
    SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
    FATAL_ERROR = CMake 错误, 终止所有处理过程;
    

    LINK_DIRECTORIES

    LINK_DIRECTORIES 添加需要链接的库文件目录
    LINK_DIRECTORIES (DIR1 DIR2 ...)在根目录下,设置全局路径,在单个项目下,设置当前项目的库目录
    
    IF(WIN32)
    	IF(CMAKE_CL_64)
    		SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win64)
    	ELSE(CMAKE_CL_64)
    		SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win32)
    	ENDIF(CMAKE_CL_64)
    ENDIF(WIN32)
    LINK_DIRECTORIES(${BASELIB_PATH})
    设置windows下的BASELIB_PATH 根目录,这儿,默认目录是CMakeLists.txt的目录下的./bin/win64、
    ./bin/win64/debug、./bin/win64/release。这三个目录
    

    CMAKE_C_FLAGS/CMAKE_CXX_FLAGS

    SET命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的
    IF(WIN32)
    	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
    ELSE(WIN32)
    	SET(CMAKE_CXX_STANDARD 11)
    	SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS}" -O0 -Wall -g3 -ggdb -D_DEBUG -DDEBUG)
    	SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -DNDEBUG")
    	ADD_COMPILE_OPTIONS(-std=c++11)
    ENDIF(WIN32)
    CMAKE_CXX_FLAGS_DEBUG 是设置debug的CXXFLAGS
    CMAKE_CXX_FLAGS_RELEASE 是设置release的CXXFLAGS
    ADD_COMPILE_OPTIONS(-std=c++11) 设置c++11
    
    修改CMake脚本 在其中加上显示的C++11标准声明后 SET(CMAKE_CXX_STANDARD 11)
    很明显 问题在于cmake没有自动识别C++11的语法功能
    而低版本的g++编译器 应该也没有自动识别标准的功能
    所以需要在CMake脚本中显示声明
    而高版本的编译器 应该加入了对语法的自识别
    

    ADD_DEFINITIONS

    添加预处理
    例如
    ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
    ADD_DEFINITIONS(-DWIN32)
    

    CMAKE_CL_64

    windows CMAKE的内建变量,如果是true,就说明编译器的64位的,否则为32为的
    IF(CMAKE_CL_64)
    	# 64
    ELSE(CMAKE_CL_64)
    	# 32
    ENDIF(CMAKE_CL_64)
    	IF(CMAKE_CL_64)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
    	ELSE(CMAKE_CL_64)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
    	ENDIF(CMAKE_CL_64)
    # 设置debug/release的lib/dll/exe目录
    

    INCLUDE_DIRECTORIES

    将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
    INCLUDE_DIRECTORIES(dir1 dir2 ...)
    INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
    

    CMAKE_PREFIX_PATH

    CMAKE_PREFIX_PATH是以分号分隔的列表,供find_package(), find_program(), find_library(), find_file()和find_path()使用,初始为空,由用户设定
    CMAKE_PREFIX_PATH是以分号分隔的列表,供find_package(), find_program(), find_library(), find_file()和find_path()使用,初始为空,由用户设定
    CMAKE_MODULE_PATH是以分号分隔的列表,供include()或 find_package()使用。初始为空,由用户设定
    
    IF(WIN32)
    	IF(CMAKE_CL_64)
    		SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019_64")
    	ELSE(CMAKE_CL_64)
    		SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019")
    	ENDIF(CMAKE_CL_64)
    	
    ELSE(WIN32)
    	SET(CMAKE_PREFIX_PATH ${QTDIR}/5.15.2)
    ENDIF(WIN32)
    设置Qt对应的目录
    

    ADD_SUBDIRECTORY

    ADD_SUBDIRECTORY(子文件夹名)表示对子文件夹项目进行cmake编译。
    ADD_SUBDIRECTORY(dir1)
    ADD_SUBDIRECTORY(dir2)
    ADD_SUBDIRECTORY(dir3)
    ...
    

    AUX_SOURCE_DIRECTORY

    AUX_SOURCE_DIRECTORY 查找在某个路径下的所有源文件。
    AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES)
    

    CMAKE_CURRENT_SOURCE_DIR

    CMAKE_CURRENT_SOURCE_DIR:当前正在处理的源目录的路径.
    

    CMAKE_INCLUDE_CURRENT_DIR

    #设置工程包含当前目录,非必须
    SET(CMAKE_INCLUDE_CURRENT_DIR ON) 
    

    Qt 相关的设置

    # REQUIRED: 意味着找不到报错并不会继续下去,FIND_PACKAGE命令是用来查找依赖包的,理想情况下,一句
    # FIND_PACKAGE()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到
    FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
    # TARGET_LINK_LIBRARIES 链接库
    # TARGET_LINK_LIBRARIES 需要放在ADD_EXECUTABLE或者ADD_LIBRARY之下
    TARGET_LINK_LIBRARIES(${PRJ_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
    
    SET(CMAKE_AUTOMOC ON) # 打开全局moc
    set(CMAKE_AUTOUIC ON) # 打开全局uic
    set(CMAKE_AUTORCC ON) # 打开全局rcc,本示例中没有使用qrc,此句可以去掉
    SET(MOC_FILES 
    # moc文件Q_OBJECT对应的头文件
    xxx.h
    )
    SET(UI_FILES
    # ui文件
    XXX.ui
    )
    # 添加筛选器,Ui 为名称,UI_FILES 的文件
    SOURCE_GROUP(Ui FILES ${UI_FILES})
    QT5_WRAP_CPP(THIS_SOURCE_FILES ${MOC_FILES})
    QT5_WRAP_UI(THIS_SOURCE_FILES ${UI_FILES})
    
    

    ADD_LIBRARY

    add_library(<name> [STATIC | SHARED | MODULE]
                [EXCLUDE_FROM_ALL]
                source1 [source2 ...])
    <name> :库的名字,直接写名字即可,不要写lib,会自动加上前缀的哈。
    [STATIC | SHARED | MODULE] :类型有三种。
    SHARED,动态库
    STATIC,静态库
    MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
    EXCLUDE_FROM_ALL:这个库不会被默认构建,除非有其他的组件依赖或者手
    工构建。
    

    ADD_EXECUTABLE

    ADD_EXECUTABLE (<name> [WIN32] [MACOSX_BUNDLE]
          [EXCLUDE_FROM_ALL]
          [source1] [source2 ...])
    
    通过指定的源文件列表构建出可执行目标文件。
    

    二、实例

    上面各个使用到的cmake中的函数,接下来做个实例
    CMakeLists.txt

    CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
    
    SET(PRJ_NAME RtspService)
    PROJECT(${PRJ_NAME})
    
    IF(WIN32)
    	SET(CMAKE_DEBUG_POSTFIX "_d")
    ENDIF(WIN32)
    
    IF(NOT CMAKE_BUILD_TYPE)
    	IF(WIN32)
    	ELSE(WIN32)
    		SET(CMAKE_BUILD_TYPE Debug)
    	ENDIF(WIN32)
    
    ENDIF()
    
    IF(WIN32)
    	SET(CMAKE_SYSTEM_VERSION 10.0)
    ENDIF(WIN32)
    
    MESSAGE(STATUS ${PROJECT_SOURCE_DIR})
    MESSAGE(STATUS ${PROJECT_BINARY_DIR})
    MESSAGE(STATUS ${CMAKE_BINARY_DIR})
    
    IF(WIN32)
    	IF(CMAKE_CL_64)
    		SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win64)
    	ELSE(CMAKE_CL_64)
    		SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win32)
    	ENDIF(CMAKE_CL_64)
    ENDIF(WIN32)
    LINK_DIRECTORIES(${BASELIB_PATH})
    
    IF(WIN32)
    	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
    ELSE(WIN32)
    	SET(CMAKE_CXX_STANDARD 11)
    	SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS}" -O0 -Wall -g3 -ggdb -D_DEBUG -DDEBUG)
    	SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -DNDEBUG")
    	ADD_COMPILE_OPTIONS(-std=c++11)
    ENDIF(WIN32)
    
    IF(WIN32)
    	ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
    	SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi /Od")
    	SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
    	SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
    	
    	IF(CMAKE_CL_64)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
    	ELSE(CMAKE_CL_64)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
    		SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
    		SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
    		SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
    	ENDIF(CMAKE_CL_64)
    ENDIF(WIN32)
    
    INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
    
    IF(WIN32)
    	IF(CMAKE_CL_64)
    		SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019_64")
    	ELSE(CMAKE_CL_64)
    		SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019")
    	ENDIF(CMAKE_CL_64)
    	
    ELSE(WIN32)
    	SET(CMAKE_PREFIX_PATH ${QTDIR}/5.15.2)
    ENDIF(WIN32)
    
    ADD_SUBDIRECTORY(test/testCapture)
    ADD_SUBDIRECTORY(test/testEncoder)
    ADD_SUBDIRECTORY(test/testRtspServer)
    

    tree 查看当前目录构成tree /f >> a.txt

    CMakeLists.txt
    │  
    ├─bin
    │  │  copy64_debug.bat
    │  │  copy64_release.bat
    │  │  
    │  ├─ffmpeg-4.4
    │  │  └─win64
    │  │          avcodec-58.def
    │  │          avcodec-58.dll
    │  │          avcodec.lib
    │  │          avdevice-58.def
    │  │          avdevice-58.dll
    │  │          avdevice.lib
    │  │          avfilter-7.def
    │  │          avfilter-7.dll
    │  │          avfilter.lib
    │  │          avformat-58.def
    │  │          avformat-58.dll
    │  │          avformat.lib
    │  │          avutil-56.def
    │  │          avutil-56.dll
    │  │          avutil.lib
    │  │          ffmpeg.exe
    │  │          ffplay.exe
    │  │          ffprobe.exe
    │  │          libavcodec.dll.a
    │  │          libavdevice.dll.a
    │  │          libavfilter.dll.a
    │  │          libavformat.dll.a
    │  │          libavutil.dll.a
    │  │          libpostproc.dll.a
    │  │          libswresample.dll.a
    │  │          libswscale.dll.a
    │  │          postproc-55.def
    │  │          postproc-55.dll
    │  │          postproc.lib
    │  │          swresample-3.def
    │  │          swresample-3.dll
    │  │          swresample.lib
    │  │          swscale-5.def
    │  │          swscale-5.dll
    │  │          swscale.lib
    │  │          
    │  └─win64
    │      ├─debug
    │      │      avcodec-58.def
    │      │      avcodec-58.dll
    │      │      avcodec.lib
    │      │      avdevice-58.def
    │      │      avdevice-58.dll
    │      │      avdevice.lib
    │      │      avfilter-7.def
    │      │      avfilter-7.dll
    │      │      avfilter.lib
    │      │      avformat-58.def
    │      │      avformat-58.dll
    │      │      avformat.lib
    │      │      avutil-56.def
    │      │      avutil-56.dll
    │      │      avutil.lib
    │      │      ffmpeg.exe
    │      │      ffplay.exe
    │      │      ffprobe.exe
    │      │      libavcodec.dll.a
    │      │      libavdevice.dll.a
    │      │      libavfilter.dll.a
    │      │      libavformat.dll.a
    │      │      libavutil.dll.a
    │      │      libpostproc.dll.a
    │      │      libswresample.dll.a
    │      │      libswscale.dll.a
    │      │      postproc-55.def
    │      │      postproc-55.dll
    │      │      postproc.lib
    │      │      swresample-3.def
    │      │      swresample-3.dll
    │      │      swresample.lib
    │      │      swscale-5.def
    │      │      swscale-5.dll
    │      │      swscale.lib
    │      │      test.h264
    │      │      test.yuv
    │      │      testCapture_d.exe
    │      │      testCapture_d.pdb
    │      │      testEncoder_d.exe
    │      │      testEncoder_d.pdb
    │      │      testRtspServer_d.exe
    │      │      testRtspServer_d.pdb
    │      │      
    │      └─release
    │              avcodec-58.def
    │              avcodec-58.dll
    │              avcodec.lib
    │              avdevice-58.def
    │              avdevice-58.dll
    │              avdevice.lib
    │              avfilter-7.def
    │              avfilter-7.dll
    │              avfilter.lib
    │              avformat-58.def
    │              avformat-58.dll
    │              avformat.lib
    │              avutil-56.def
    │              avutil-56.dll
    │              avutil.lib
    │              ffmpeg.exe
    │              ffplay.exe
    │              ffprobe.exe
    │              libavcodec.dll.a
    │              libavdevice.dll.a
    │              libavfilter.dll.a
    │              libavformat.dll.a
    │              libavutil.dll.a
    │              libpostproc.dll.a
    │              libswresample.dll.a
    │              libswscale.dll.a
    │              postproc-55.def
    │              postproc-55.dll
    │              postproc.lib
    │              swresample-3.def
    │              swresample-3.dll
    │              swresample.lib
    │              swscale-5.def
    │              swscale-5.dll
    │              swscale.lib
    │              
    ├─include
    │  │  CaptureCfg.h
    │  │  RTSPCfg.h
    │  │  
    │  ├─libavcodec
    │  │      ac3_parser.h
    │  │      adts_parser.h
    │  │      avcodec.h
    │  │      avdct.h
    │  │      avfft.h
    │  │      bsf.h
    │  │      codec.h
    │  │      codec_desc.h
    │  │      codec_id.h
    │  │      codec_par.h
    │  │      d3d11va.h
    │  │      dirac.h
    │  │      dv_profile.h
    │  │      dxva2.h
    │  │      jni.h
    │  │      mediacodec.h
    │  │      packet.h
    │  │      qsv.h
    │  │      vaapi.h
    │  │      vdpau.h
    │  │      version.h
    │  │      videotoolbox.h
    │  │      vorbis_parser.h
    │  │      xvmc.h
    │  │      
    │  ├─libavdevice
    │  │      avdevice.h
    │  │      version.h
    │  │      
    │  ├─libavfilter
    │  │      avfilter.h
    │  │      buffersink.h
    │  │      buffersrc.h
    │  │      version.h
    │  │      
    │  ├─libavformat
    │  │      avformat.h
    │  │      avio.h
    │  │      version.h
    │  │      
    │  ├─libavutil
    │  │      adler32.h
    │  │      aes.h
    │  │      aes_ctr.h
    │  │      attributes.h
    │  │      audio_fifo.h
    │  │      avassert.h
    │  │      avconfig.h
    │  │      avstring.h
    │  │      avutil.h
    │  │      base64.h
    │  │      blowfish.h
    │  │      bprint.h
    │  │      bswap.h
    │  │      buffer.h
    │  │      camellia.h
    │  │      cast5.h
    │  │      channel_layout.h
    │  │      common.h
    │  │      cpu.h
    │  │      crc.h
    │  │      des.h
    │  │      dict.h
    │  │      display.h
    │  │      dovi_meta.h
    │  │      downmix_info.h
    │  │      encryption_info.h
    │  │      error.h
    │  │      eval.h
    │  │      ffversion.h
    │  │      fifo.h
    │  │      file.h
    │  │      film_grain_params.h
    │  │      frame.h
    │  │      hash.h
    │  │      hdr_dynamic_metadata.h
    │  │      hmac.h
    │  │      hwcontext.h
    │  │      hwcontext_cuda.h
    │  │      hwcontext_d3d11va.h
    │  │      hwcontext_drm.h
    │  │      hwcontext_dxva2.h
    │  │      hwcontext_mediacodec.h
    │  │      hwcontext_opencl.h
    │  │      hwcontext_qsv.h
    │  │      hwcontext_vaapi.h
    │  │      hwcontext_vdpau.h
    │  │      hwcontext_videotoolbox.h
    │  │      hwcontext_vulkan.h
    │  │      imgutils.h
    │  │      intfloat.h
    │  │      intreadwrite.h
    │  │      lfg.h
    │  │      log.h
    │  │      lzo.h
    │  │      macros.h
    │  │      mastering_display_metadata.h
    │  │      mathematics.h
    │  │      md5.h
    │  │      mem.h
    │  │      motion_vector.h
    │  │      murmur3.h
    │  │      opt.h
    │  │      parseutils.h
    │  │      pixdesc.h
    │  │      pixelutils.h
    │  │      pixfmt.h
    │  │      random_seed.h
    │  │      rational.h
    │  │      rc4.h
    │  │      replaygain.h
    │  │      ripemd.h
    │  │      samplefmt.h
    │  │      sha.h
    │  │      sha512.h
    │  │      spherical.h
    │  │      stereo3d.h
    │  │      tea.h
    │  │      threadmessage.h
    │  │      time.h
    │  │      timecode.h
    │  │      timestamp.h
    │  │      tree.h
    │  │      twofish.h
    │  │      tx.h
    │  │      version.h
    │  │      video_enc_params.h
    │  │      xtea.h
    │  │      
    │  ├─libpostproc
    │  │      postprocess.h
    │  │      version.h
    │  │      
    │  ├─libswresample
    │  │      swresample.h
    │  │      version.h
    │  │      
    │  └─libswscale
    │          swscale.h
    │          version.h
    │          
    ├─src
    └─test
        ├─testCapture
        │      CMakeLists.txt
        │      main.cpp
        │      
        ├─testEncoder
        │      CMakeLists.txt
        │      main.cpp
        │      
        └─testRtspServer
            │  CMakeLists.txt
            │  main.cpp
            │  
            ├─3rdpart
            │  └─md5
            │          COPYING
            │          md5.hpp
            │          
            ├─net
            │      Acceptor.cpp
            │      Acceptor.h
            │      BufferReader.cpp
            │      BufferReader.h
            │      BufferWriter.cpp
            │      BufferWriter.h
            │      Channel.h
            │      EpollTaskScheduler.cpp
            │      EpollTaskScheduler.h
            │      EventLoop.cpp
            │      EventLoop.h
            │      log.h
            │      Logger.cpp
            │      Logger.h
            │      MemoryManager.cpp
            │      MemoryManager.h
            │      NetInterface.cpp
            │      NetInterface.h
            │      Pipe.cpp
            │      Pipe.h
            │      RingBuffer.h
            │      SelectTaskScheduler.cpp
            │      SelectTaskScheduler.h
            │      Socket.h
            │      SocketUtil.cpp
            │      SocketUtil.h
            │      TaskScheduler.cpp
            │      TaskScheduler.h
            │      TcpConnection.cpp
            │      TcpConnection.h
            │      TcpServer.cpp
            │      TcpServer.h
            │      TcpSocket.cpp
            │      TcpSocket.h
            │      Timer.cpp
            │      Timer.h
            │      Timestamp.cpp
            │      Timestamp.h
            │      
            └─xop
                    AACSource.cpp
                    AACSource.h
                    DigestAuthentication.cpp
                    DigestAuthentication.h
                    G711ASource.cpp
                    G711ASource.h
                    H264Parser.cpp
                    H264Parser.h
                    H264Source.cpp
                    H264Source.h
                    H265Source.cpp
                    H265Source.h
                    media.h
                    MediaSession.cpp
                    MediaSession.h
                    MediaSource.h
                    rtp.h
                    RtpConnection.cpp
                    RtpConnection.h
                    rtsp.h
                    RtspConnection.cpp
                    RtspConnection.h
                    RtspMessage.cpp
                    RtspMessage.h
                    RtspPusher.cpp
                    RtspPusher.h
                    RtspServer.cpp
                    RtspServer.h
                    VP8Source.cpp
                    VP8Source.h
    

    test/testCapture CMakeLists.txt 写法,test/testEncoder类似

    CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
    
    IF(WIN32)
    	CMAKE_POLICY(SET CMP0020 NEW)
    ENDIF(WIN32)
    
    SET(PRJ_NAME testCapture)
    
    PROJECT(${PRJ_NAME})
    
    ADD_DEFINITIONS(-DVLCMEDIA_LIBRARY_EXPORT)
    ADD_DEFINITIONS(-DWIN32)
    
    AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES)
    
    MESSAGE(STATUS ${PROJECT_SOURCE_DIR})
    MESSAGE(STATUS ${PROJECT_BINARY_DIR})
    MESSAGE(STATUS ${CMAKE_BINARY_DIR})
    
    SET(INCLUDE_PATHS
    ${CMAKE_CURRENT_SOURCE_DIR}/../../include
    ${CMAKE_CURRENT_SOURCE_DIR}/../../
    ${CMAKE_CURRENT_SOURCE_DIR}/
    )
    
    
    INCLUDE_DIRECTORIES(${3DRLIB_INCLUDE_DIR} ${INCLUDE_PATHS})
    LINK_DIRECTORIES(${3DRLIB_INCLUDE_DIR})
    
    FILE(GLOB INCLUDE_FILES  "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
    FILE(GLOB SRC_FILES  ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
    
    SET(THIS_SOURCE_FILES ${INCLUDE_FILES} ${SOURCE_FILES} ${SRC_FILES})
    
    SET(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    #FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
    #SET(MOC_FILES )
    
    #QT5_WRAP_CPP(THIS_SOURCE_FILES ${MOC_FILES})
    
    
    # 添加筛选器
    
    SET(MAIN
    main.cpp
    )
    
    
    SOURCE_GROUP(Main FILES ${MAIN})
    
    ADD_EXECUTABLE(${PRJ_NAME} 
    ${THIS_SOURCE_FILES} 
    ${Main} 
    )
    
    TARGET_LINK_LIBRARIES(${PRJ_NAME} avcodec)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} avdevice)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} avfilter)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} avformat)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} avutil)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} postproc)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} swresample)
    TARGET_LINK_LIBRARIES(${PRJ_NAME} swscale)
    
    #TARGET_LINK_LIBRARIES(${PRJ_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
    
    IF(WIN32)
    	SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES DEBUG_POSTFIX _d)
    	SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES LINK_FLAGS "/OPT:NOREF /OPT:NOICF")
    ENDIF(WIN32)
    

    test/testRtspServer CMakeLists.txt, 这个稍微复杂点,可以参考这个

    CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
    
    IF(WIN32)
    	CMAKE_POLICY(SET CMP0020 NEW)
    ENDIF(WIN32)
    
    SET(PRJ_NAME testRtspServer)
    
    PROJECT(${PRJ_NAME})
    
    ADD_DEFINITIONS(-DVLCMEDIA_LIBRARY_EXPORT)
    ADD_DEFINITIONS(-DWIN32)
    
    AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES)
    
    
    SET(INCLUDE_PATHS
    ${CMAKE_CURRENT_SOURCE_DIR}/../../include
    ${CMAKE_CURRENT_SOURCE_DIR}/../../
    ${CMAKE_CURRENT_SOURCE_DIR}/3rdpart
    ${CMAKE_CURRENT_SOURCE_DIR}/xop
    ${CMAKE_CURRENT_SOURCE_DIR}/net
    ${CMAKE_CURRENT_SOURCE_DIR}/
    )
    
    
    INCLUDE_DIRECTORIES(${3DRLIB_INCLUDE_DIR} ${INCLUDE_PATHS})
    LINK_DIRECTORIES(${3DRLIB_INCLUDE_DIR})
    
    FILE(GLOB INCLUDE_FILES  "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
    FILE(GLOB SRC_FILES  ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
    
    SET(THIS_SOURCE_FILES ${INCLUDE_FILES} ${SOURCE_FILES} ${SRC_FILES})
    
    SET(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    #FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
    #SET(MOC_FILES )
    
    #QT5_WRAP_CPP(THIS_SOURCE_FILES ${MOC_FILES})
    
    
    # 添加筛选器
    SET(3RDPART
    3rdpart/md5/md5.hpp
    )
    
    SET(NET
    net/Acceptor.cpp
    net/Acceptor.h
    net/BufferReader.cpp
    net/BufferReader.h
    net/BufferWriter.cpp
    net/BufferWriter.h
    net/Channel.h
    net/EpollTaskScheduler.cpp
    net/EpollTaskScheduler.h
    net/EventLoop.cpp
    net/EventLoop.h
    net/log.h
    net/Logger.cpp
    net/Logger.h
    net/MemoryManager.cpp
    net/MemoryManager.h
    net/NetInterface.cpp
    net/NetInterface.h
    net/Pipe.cpp
    net/Pipe.h
    net/RingBuffer.h
    net/SelectTaskScheduler.cpp
    net/SelectTaskScheduler.h
    net/Socket.h
    net/SocketUtil.cpp
    net/SocketUtil.h
    net/TaskScheduler.cpp
    net/TaskScheduler.h
    net/TcpConnection.cpp
    net/TcpConnection.h
    net/TcpServer.cpp
    net/TcpServer.h
    net/TcpSocket.cpp
    net/TcpSocket.h
    net/Timer.cpp
    net/Timer.h
    net/Timestamp.cpp
    net/Timestamp.h
    )
    
    SET(XOP
    xop/AACSource.cpp
    xop/AACSource.h
    xop/DigestAuthentication.cpp
    xop/DigestAuthentication.h
    xop/G711ASource.cpp
    xop/G711ASource.h
    xop/H264Parser.cpp
    xop/H264Parser.h
    xop/H264Source.cpp
    xop/H264Source.h
    xop/H265Source.cpp
    xop/H265Source.h
    xop/media.h
    xop/MediaSession.cpp
    xop/MediaSession.h
    xop/MediaSource.h
    xop/rtp.h
    xop/RtpConnection.cpp
    xop/RtpConnection.h
    xop/rtsp.h
    xop/RtspConnection.cpp
    xop/RtspConnection.h
    xop/RtspMessage.cpp
    xop/RtspMessage.h
    xop/RtspPusher.cpp
    xop/RtspPusher.h
    xop/RtspServer.cpp
    xop/RtspServer.h
    xop/VP8Source.cpp
    xop/VP8Source.h
    )
    
    SET(MAIN
    main.cpp
    )
    
    SOURCE_GROUP(3rdpart FILES ${3RDPART})
    SOURCE_GROUP(net FILES ${NET})
    SOURCE_GROUP(xop FILES ${XOP})
    SOURCE_GROUP(main FILES ${MAIN})
    
    ADD_EXECUTABLE(${PRJ_NAME} 
    ${THIS_SOURCE_FILES} 
    ${3RDPART} 
    ${NET} 
    ${XOP} 
    ${MAIN} 
    )
    
    #TARGET_LINK_LIBRARIES(${PRJ_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
    
    IF(WIN32)
    	SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES DEBUG_POSTFIX _d)
    	SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES LINK_FLAGS "/OPT:NOREF /OPT:NOICF")
    ENDIF(WIN32)
    

    三、结束语

    上面的示例,代码和灵感来源与下面,以后的项目尽量统一使用VS+Qt+CMAKE

    1. 技术视频参考: https://ke.qq.com/course/3202131?flowToken=1040952
    2. 实例博客地址: 基于Qt和ffmpeg的抓屏rtsp服务(二)
    3. 代码地址:gitee地址
    展开全文
  • cmake 拾遗之.cmake文件

    千次阅读 2021-01-13 10:52:18
    cmake 拾遗之.cmake文件首先我们看一下这个文件在哪儿我们来看看这个文件长成神马样子 cmake 拾遗之.cmake文件 这个文件是神马,是不是从来没注意过,但是其至关重要。主要功能有两个,一是引导你的CMakeLists.txt...

    cmake 拾遗之.cmake文件

    这个文件是神马,是不是从来没注意过,但是其至关重要。主要功能有两个,一是引导你的CMakeLists.txt找到对应包的地址,二是作为脚本(类似于python脚本)实现一些在make之前处理的逻辑,比如说proto文件生成xx.pb.h 和xx.pb.cc文件等。

    首先我们看一下这个文件在哪儿

    假设你已经源码编译路一个库,我以octomap 库为例说明。这个是机器人中一个常见点地图表达用的库

    # 创建文件夹
    xx:~/data/project/slam/octomap-devel$ mkdir build && cd build
    #生成makefile
    xx:~/data/project/slam/octomap-devel/build$ cmake ..
    #编译
    xx:~/data/project/slam/octomap-devel/build$ make
    

    现在我们执行一下install

    ~/data/project/slam/octomap-devel/build$ sudo make install
    [sudo] bamboo 的密码: 
    [  4%] Built target octomath-static
    [  7%] Built target octomath
    .......
    [100%] Built target exampleEDT3D
    Install the project...
    -- Install configuration: ""
    -- Installing: /usr/local/include/octomap/AbstractOcTree.h
    -- Installing: /usr/local/include/octomap/AbstractOccupancyOcTree.h
    -- Installing: /usr/local/include/octomap/ColorOcTree.h
    ....
    -- Installing: /usr/local/include/octomap/math/Utils.h
    -- Installing: /usr/local/include/octomap/math/Vector3.h
    -- Installing: /usr/local/share/octomap/package.xml
    
    -- Installing: /usr/local/share/octomap/octomap-config.cmake
    -- Installing: /usr/local/share/octomap/octomap-config-version.cmake
    -- Installing: /usr/local/lib/pkgconfig/octomap.pc
    
    -- Installing: /usr/local/lib/liboctomath.so.1.9.5
    -- Installing: /usr/local/lib/liboctomath.so.1.9
    
    -- Set runtime path of "/usr/local/lib/liboctomath.so.1.9.5" to "/usr/local/lib"
    
    -- Installing: /usr/local/lib/liboctomath.so
    -- Installing: /usr/local/lib/liboctomath.a
    -- Installing: /usr/local/lib/liboctomap.so.1.9.5
    -- Installing: /usr/local/lib/liboctomap.so.1.9
    -- Set runtime path of "/usr/local/lib/liboctomap.so.1.9.5" to "/usr/local/lib"
    -- Installing: /usr/local/lib/liboctomap.so
    -- Installing: /usr/local/lib/liboctomap.a
    
    -- Installing: /usr/local/share/octomap/octomap-targets.cmake
    -- Installing: /usr/local/bin/graph2tree
    -- Set runtime path of "/usr/local/bin/graph2tree" to "/usr/local/lib"
    -- Installing: /usr/local/bin/log2graph
    -- Set runtime path of "/usr/local/bin/log2graph" to "/usr/local/lib"
    -- Installing: /usr/local/bin/binvox2bt
    -- Set runtime path of "/usr/local/bin/binvox2bt" to "/usr/local/lib"
    -- Installing: /usr/local/bin/bt2vrml
    -- Set runtime path of "/usr/local/bin/bt2vrml" to "/usr/local/lib"
    -- Installing: /usr/local/bin/edit_octree
    -- Set runtime path of "/usr/local/bin/edit_octree" to "/usr/local/lib"
    -- Installing: /usr/local/bin/convert_octree
    -- Set runtime path of "/usr/local/bin/convert_octree" to "/usr/local/lib"
    -- Installing: /usr/local/bin/eval_octree_accuracy
    -- Set runtime path of "/usr/local/bin/eval_octree_accuracy" to "/usr/local/lib"
    -- Installing: /usr/local/bin/compare_octrees
    -- Set runtime path of "/usr/local/bin/compare_octrees" to "/usr/local/lib"
    -- Installing: /usr/local/bin/octovis
    -- Set runtime path of "/usr/local/bin/octovis" to "/usr/local/lib:/home/bamboo/data/software/anaconda3/lib"
    -- Installing: /usr/local/lib/liboctovis.a
    -- Installing: /usr/local/lib/liboctovis.so.1.9.5
    -- Installing: /usr/local/lib/liboctovis.so.1.9
    -- Set runtime path of "/usr/local/lib/liboctovis.so.1.9.5" to "/usr/local/lib"
    -- Installing: /usr/local/lib/liboctovis.so
    -- Installing: /usr/local/share/octovis/octovis-targets.cmake
    -- Installing: /usr/local/include/octovis/ColorOcTreeDrawer.h
    -- Installing: /usr/local/include/octovis/OcTreeDrawer.h
    -- Installing: /usr/local/include/octovis/OcTreeRecord.h
    -- Installing: /usr/local/include/octovis/PointcloudDrawer.h
    -- Installing: /usr/local/include/octovis/SceneObject.h
    -- Installing: /usr/local/include/octovis/SelectionBox.h
    -- Installing: /usr/local/include/octovis/TrajectoryDrawer.h
    -- Installing: /usr/local/share/octovis/octovis-config.cmake
    -- Installing: /usr/local/share/octovis/octovis-config-version.cmake
    -- Installing: /usr/local/share/octovis/package.xml
    -- Installing: /usr/local/include/dynamicEDT3D/bucketedqueue.h
    -- Installing: /usr/local/include/dynamicEDT3D/bucketedqueue.hxx
    -- Installing: /usr/local/include/dynamicEDT3D/dynamicEDT3D.h
    -- Installing: /usr/local/include/dynamicEDT3D/dynamicEDTOctomap.h
    -- Installing: /usr/local/include/dynamicEDT3D/dynamicEDTOctomap.hxx
    -- Installing: /usr/local/include/dynamicEDT3D/point.h
    -- Installing: /usr/local/share/dynamic_edt_3d/package.xml
    -- Installing: /usr/local/share/dynamicEDT3D/dynamicEDT3DConfig.cmake
    -- Installing: /usr/local/share/dynamicEDT3D/dynamicEDT3DConfig-version.cmake
    -- Installing: /usr/local/lib/pkgconfig/dynamicEDT3D.pc
    -- Installing: /usr/local/lib/libdynamicedt3d.so.1.9.5
    -- Installing: /usr/local/lib/libdynamicedt3d.so.1.9
    -- Set runtime path of "/usr/local/lib/libdynamicedt3d.so.1.9.5" to "/usr/local/lib"
    -- Installing: /usr/local/lib/libdynamicedt3d.so
    -- Installing: /usr/local/lib/libdynamicedt3d.a
    -- Installing: /usr/local/share/dynamicEDT3D/dynamicEDT3DTargets.cmake
    
    

    至少可以看到四点:

    • .h文件安装到了 /usr/local/octomap 文件夹下了
    -- Installing: /usr/local/include/octomap/AbstractOcTree.h
    
    • .so文件安装到了 /usr/local/lib/ 文件夹下了
    -- Installing: /usr/local/lib/liboctomath.so.1.9.5
    
    • 可执行文件安装到了/usr/local/bin 文件夹下了
    -- Installing: /usr/local/bin/octovis
    
    • .cmake文件 安装到了/usr/local/share/octomap 文件夹下了
    -- Installing: /usr/local/share/octomap/octomap-targets.cmake
    

    还有一点,也特别重要:
    设置 runtime path

    -- Set runtime path of "/usr/local/lib/liboctomath.so.1.9.5" to "/usr/local/lib"
    

    我们来看看这个文件长成神马样子

    @[TOC]
    
    # cmake 拾遗之.cmake文件
    
    这个文件是神马,是不是从来没注意过,但是其至关重要。主要功能有两个,一是引导你的CMakeLists.txt找到对应包的地址,二是作为脚本(类似于python脚本)实现一些在make之前处理的逻辑,比如说proto文件生成xx.pb.h 和xx.pb.cc文件等。
    
    ## 首先我们看一下这个文件在哪儿
    假设你已经源码编译路一个库,我以octomap 库为例说明。这个是机器人中一个常见点地图表达用的库
    ```bash
    # 创建文件夹
    xx:~/data/project/slam/octomap-devel$ mkdir build && cd build
    #生成makefile
    xx:~/data/project/slam/octomap-devel/build$ cmake ..
    #编译
    xx:~/data/project/slam/octomap-devel/build$ make
    

    现在我们执行一下install

    ~/data/project/slam/octomap-devel/build$ sudo make install
    [sudo] bamboo 的密码: 
    [  4%] Built target octomath-static
    [  7%] Built target octomath
    .......
    [100%] Built target exampleEDT3D
    Install the project...
    -- Install configuration: ""
    -- Installing: /usr/local/include/octomap/AbstractOcTree.h
    -- Installing: /usr/local/include/octomap/AbstractOccupancyOcTree.h
    -- Installing: /usr/local/include/octomap/ColorOcTree.h
    ....
    -- Installing: /usr/local/include/octomap/math/Utils.h
    -- Installing: /usr/local/include/octomap/math/Vector3.h
    -- Installing: /usr/local/share/octomap/package.xml
    
    -- Installing: /usr/local/share/octomap/octomap-config.cmake
    -- Installing: /usr/local/share/octomap/octomap-config-version.cmake
    -- Installing: /usr/local/lib/pkgconfig/octomap.pc
    
    -- Installing: /usr/local/lib/liboctomath.so.1.9.5
    -- Installing: /usr/local/lib/liboctomath.so.1.9
    
    -- Set runtime path of "/usr/local/lib/liboctomath.so.1.9.5" to "/usr/local/lib"
    
    -- Installing: /usr/local/lib/liboctomath.so
    -- Installing: /usr/local/lib/liboctomath.a
    -- Installing: /usr/local/lib/liboctomap.so.1.9.5
    -- Installing: /usr/local/lib/liboctomap.so.1.9
    -- Set runtime path of "/usr/local/lib/liboctomap.so.1.9.5" to "/usr/local/lib"
    -- Installing: /usr/local/lib/liboctomap.so
    -- Installing: /usr/local/lib/liboctomap.a
    
    -- Installing: /usr/local/share/octomap/octomap-targets.cmake
    -- Installing: /usr/local/bin/graph2tree
    -- Set runtime path of "/usr/local/bin/graph2tree" to "/usr/local/lib"
    -- Installing: /usr/local/bin/log2graph
    -- Set runtime path of "/usr/local/bin/log2graph" to "/usr/local/lib"
    -- Installing: /usr/local/bin/binvox2bt
    -- Set runtime path of "/usr/local/bin/binvox2bt" to "/usr/local/lib"
    -- Installing: /usr/local/bin/bt2vrml
    -- Set runtime path of "/usr/local/bin/bt2vrml" to "/usr/local/lib"
    -- Installing: /usr/local/bin/edit_octree
    -- Set runtime path of "/usr/local/bin/edit_octree" to "/usr/local/lib"
    -- Installing: /usr/local/bin/convert_octree
    -- Set runtime path of "/usr/local/bin/convert_octree" to "/usr/local/lib"
    -- Installing: /usr/local/bin/eval_octree_accuracy
    -- Set runtime path of "/usr/local/bin/eval_octree_accuracy" to "/usr/local/lib"
    -- Installing: /usr/local/bin/compare_octrees
    -- Set runtime path of "/usr/local/bin/compare_octrees" to "/usr/local/lib"
    -- Installing: /usr/local/bin/octovis
    -- Set runtime path of "/usr/local/bin/octovis" to "/usr/local/lib:/home/bamboo/data/software/anaconda3/lib"
    -- Installing: /usr/local/lib/liboctovis.a
    -- Installing: /usr/local/lib/liboctovis.so.1.9.5
    -- Installing: /usr/local/lib/liboctovis.so.1.9
    -- Set runtime path of "/usr/local/lib/liboctovis.so.1.9.5" to "/usr/local/lib"
    -- Installing: /usr/local/lib/liboctovis.so
    -- Installing: /usr/local/share/octovis/octovis-targets.cmake
    -- Installing: /usr/local/include/octovis/ColorOcTreeDrawer.h
    -- Installing: /usr/local/include/octovis/OcTreeDrawer.h
    -- Installing: /usr/local/include/octovis/OcTreeRecord.h
    -- Installing: /usr/local/include/octovis/PointcloudDrawer.h
    -- Installing: /usr/local/include/octovis/SceneObject.h
    -- Installing: /usr/local/include/octovis/SelectionBox.h
    -- Installing: /usr/local/include/octovis/TrajectoryDrawer.h
    -- Installing: /usr/local/share/octovis/octovis-config.cmake
    -- Installing: /usr/local/share/octovis/octovis-config-version.cmake
    -- Installing: /usr/local/share/octovis/package.xml
    -- Installing: /usr/local/include/dynamicEDT3D/bucketedqueue.h
    -- Installing: /usr/local/include/dynamicEDT3D/bucketedqueue.hxx
    -- Installing: /usr/local/include/dynamicEDT3D/dynamicEDT3D.h
    -- Installing: /usr/local/include/dynamicEDT3D/dynamicEDTOctomap.h
    -- Installing: /usr/local/include/dynamicEDT3D/dynamicEDTOctomap.hxx
    -- Installing: /usr/local/include/dynamicEDT3D/point.h
    -- Installing: /usr/local/share/dynamic_edt_3d/package.xml
    -- Installing: /usr/local/share/dynamicEDT3D/dynamicEDT3DConfig.cmake
    -- Installing: /usr/local/share/dynamicEDT3D/dynamicEDT3DConfig-version.cmake
    -- Installing: /usr/local/lib/pkgconfig/dynamicEDT3D.pc
    -- Installing: /usr/local/lib/libdynamicedt3d.so.1.9.5
    -- Installing: /usr/local/lib/libdynamicedt3d.so.1.9
    -- Set runtime path of "/usr/local/lib/libdynamicedt3d.so.1.9.5" to "/usr/local/lib"
    -- Installing: /usr/local/lib/libdynamicedt3d.so
    -- Installing: /usr/local/lib/libdynamicedt3d.a
    -- Installing: /usr/local/share/dynamicEDT3D/dynamicEDT3DTargets.cmake
    
    

    至少可以看到四点:

    • .h文件安装到了 /usr/local/octomap 文件夹下了
    -- Installing: /usr/local/include/octomap/AbstractOcTree.h
    
    • .so文件安装到了 /usr/local/lib/ 文件夹下了
    -- Installing: /usr/local/lib/liboctomath.so.1.9.5
    
    • 可执行文件安装到了/usr/local/bin 文件夹下了
    -- Installing: /usr/local/bin/octovis
    
    • .cmake文件 安装到了/usr/local/share/octomap 文件夹下了
    -- Installing: /usr/local/share/octomap/octomap-targets.cmake
    

    还有一点,也特别重要:
    设置 runtime path

    -- Set runtime path of "/usr/local/lib/liboctomath.so.1.9.5" to "/usr/local/lib"
    

    我们来看看这个文件长成神马样子

    xx:cd /usr/local/share
    
    xx:/usr/local/share$ ls
    ca-certificates  dynamic_edt_3d  dynamicEDT3D  eigen3  fonts  man  octomap  octovis  pcl-1.10  pkgconfig  sgml  xml
    
    xx:/usr/local/share$ cd octomap/
    xx:/usr/local/share/octomap$ ls
    octomap-config.cmake  octomap-config-version.cmake  octomap-targets.cmake  package.xml
    
    xx:/usr/local/share/octomap$ vim octomap-config.cmake
    
      1 # ===================================================================================
      2 #  The OctoMap CMake configuration file
      3 #
      4 #             ** File generated automatically, do not modify **
      5 #
      6 #  Usage from an external project:
      7 #    In your CMakeLists.txt, add these lines:
      8 #
      9 #    FIND_PACKAGE(OCTOMAP REQUIRED )
     10 #    INCLUDE_DIRECTORIES(${OCTOMAP_INCLUDE_DIRS})
     11 #    TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${OCTOMAP_LIBRARIES})
     12 #
     13 #
     14 #    This file will define the following variables:
     15 #      - OCTOMAP_LIBRARIES      : The list of libraries to links against.
     16 #      - OCTOMAP_LIBRARY_DIRS   : The directory where lib files are. Calling
     17 #                                 LINK_DIRECTORIES with this path is NOT needed.
     18 #      - OCTOMAP_INCLUDE_DIRS   : The OctoMap include directories.
     19 #      - OCTOMAP_MAJOR_VERSION  : Major version.
     20 #      - OCTOMAP_MINOR_VERSION  : Minor version.
     21 #      - OCTOMAP_PATCH_VERSION  : Patch version.
     22 #      - OCTOMAP_VERSION        : Major.Minor.Patch version.
     23 #
     24 # ===================================================================================
     25 
     26 
     27 ####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
     28 ####### Any changes to this file will be overwritten by the next CMake run ####
     29 ####### The input file was octomap-config.cmake.in                            ########
    
    
     31 get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../" ABSOLUTE)
     32 
     33 macro(set_and_check _var _file)
     34   set(${_var} "${_file}")
     35   if(NOT EXISTS "${_file}")
     36     message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
     37   endif()
     38 endmacro()
     39 
     40 macro(check_required_components _NAME)
     41   foreach(comp ${${_NAME}_FIND_COMPONENTS})
     42     if(NOT ${_NAME}_${comp}_FOUND)
     43       if(${_NAME}_FIND_REQUIRED_${comp})
     44         set(${_NAME}_FOUND FALSE)
     45       endif()
     46     endif()
     47   endforeach()
     48 endmacro()
    
     50 ####################################################################################
     51 
     52 set(OCTOMAP_MAJOR_VERSION "1")
     53 set(OCTOMAP_MINOR_VERSION "9")
     54 set(OCTOMAP_PATCH_VERSION "5")
     55 set(OCTOMAP_VERSION "1.9.5")
     56 
     57 set_and_check(OCTOMAP_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include")
     58 set_and_check(OCTOMAP_LIBRARY_DIRS "${PACKAGE_PREFIX_DIR}/lib")
     59 
     60 # Set library names
     61 set(OCTOMAP_LIBRARIES
     62   "${PACKAGE_PREFIX_DIR}/lib/liboctomap.so"
     63   "${PACKAGE_PREFIX_DIR}/lib/liboctomath.so"
     64 )
     65 
     66 include(${CMAKE_CURRENT_LIST_DIR}/octomap-targets.cmake)
    

    未完待续

    CMAKE_CURRENT_SOURCE_DIR
    这是当前处理的CMakeLists.txt所在的目录

    CMAKE_CURRENT_LIST_DIR
    (自2.8.3开始)这是当前正在处理的列表文件的目录.

    展开全文
  • CMake整理

    千次阅读 2021-05-17 21:26:32
    参考什么是CMakeCMake允许开发者编写一种平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如Unix的Makefile或Windows的Visual Studio工程。...
  • CMake模块

    2020-12-24 10:21:49
    (2)cmake特定的缓存变量 CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH 可以通过设定NO_CMAKE_PATH来关闭特定缓存变量的查找顺序 (3)CMake特定的环境变量 PackageName_DIR CMAKE_PREFIX_PATH ...
  • 一、Android Studio 中使用 CMake 编译单个 C++ 源文件、 二、cmake_minimum_required 命令设置最小 CMake 版本、 三、project 命令设置工程名称、 四、add_library 命令设置生成函数库、 五、find_library 命令设置...
  • cmake手册

    2021-01-28 16:10:10
    1.什么是cmake CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输 出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。...
  • CMake

    2021-08-04 11:20:27
    CMake CMake(Cross platform Make)是一个开源的跨平台自动化构建工具, 可以跨平台地生成各式各样的 makefile 或者 project 文件, 支持利用各种编译工具生成可执行程序或链接库。 CMake 自己不编译程序, 它相当...
  • CMake系列 cmake-qt

    2021-10-25 17:37:23
    cmake-qt 官方英文文档的中文翻译
  • 文章目录1. 常用的变量及规则① 预定义变量② 系统信息③ 主要开关选项④ 环境变量⑤ 常用规则2. 项目组织结构3. 自定义搜索规则4. 条件控制if…elseif…else…...PROJECT_BINARY_DIR :执行cmake命令的目录,通常是 ${
  • CMake教程

    2021-01-20 23:08:48
    CMake教程 CMake是一个构建系统,可以用于构建跨平台的C和C++项目。其它的构建系统有makefile、MSBuild以及qmake。 使用CMake作为C或C++的构建系统已经变得越来越流行了,例如: 在Jetbrains的C++ 编程 - 2020 开发...
  • cmake使用方法详解

    2021-02-08 09:55:39
    cmake 简介 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 CMake 使用...
  • CMake脚本编写

    2021-01-07 17:11:36
    4、cmake脚本不区分大小写,cmake自定义变量与linux保持一致,默认大写; 5、编写完成CMakeLists.txt后,使用cmake或ccmake(带自定义选项开关的编译)生成makefile,进一步make后才能生成目标文件。 cmak
  • CMake教程 总

    2021-01-13 22:29:50
    CMake 教程 01介绍这篇CMake教程提供了手把手的指导,涵盖了CMake中大部分构建问题。查看示例项目中的不同主题一起工作非常有用的。这个教程文档和示例可以在CMake提供的源代码的Help/guide/tutorial目录中找到。每...
  • CMake 使用

    2021-10-21 22:44:16
    当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMakeLists.txt 的配置脚本,很容易就会踩坑,遇到编译失败,一个很小的配置问题都会浪费很多时间。所谓工欲善其事必先利其器,学习 NDK 开发还是要...
  • Cmake之构建Project

    2021-03-31 15:34:50
    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件 示例文件结构 eric@eric-PC:~/Documents/work/linux-c/cmake_demo$ tree ...
  • 我的原因是Cmake版本太低,我的是2.8,换成3.0以上就可以,cmake升级的教程 -- The C compiler identification is GNU 4.8.5 -- The CXX compiler identification is GNU 4.8.5 -- Check for working C compiler: /...
  • CMake 使用教程

    2021-01-13 22:29:51
    资源本文档翻译自官方 cmake turorial 。更新日期:2018年9月27日。译者这里以 windows 平台为例,介绍了在 Windows 平台下配合 VS2017 的使用方法。虽然本文是官方的入门教程,但本教程并不是面向从未使用过 CMake ...
  • cmake安装与使用

    2021-02-01 00:32:35
    CMake(cross platform make)是一个开源的跨平台工具系列,旨在构建,测试和打包软件。使用指定名为CMakeLists.txt的配置文件可以控制软件的构建、测试和打包等流程。通过编写平台无关的CMakeLists.txt文件和需要简单...
  • CMake 来构建 C/C++ 项目是业内的主流做法。最近,我们的项目代码做了一些拆分和合并:引入其他仓库代码,并且将公共部分拆分以供多个仓库同时使用。为此,就得修改项目中的 CMake 以满足需求。 在做这件事情时...
  • 一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种,前面举了一个隐式定义的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 191,864
精华内容 76,745
关键字:

cmak