• cmake学习笔记 一


    1. cmake中可以通过set()函数来设置变量,进而,可以通过set()函数来设置数组。比如多个需要将多个头文件路径存放到一个变量里面,可以这样:

      set(INC_DIRS ${INC_DIRS} aaa)
      set(INC_DIRS ${INC_DIRS} bbb)
      
      • 1
      • 2

      这样,就将所有的值全部设置到了INC_DIRS中了(变成了一个数组)

    2. 如何添加宏定义:
      如何在cmake中以及cpp中使用同一个宏定义(比如一个宏开关)呢:

    • 首先需要在CMakeLists.txt中使用option()选项来添加一个宏,并设置默认值:

      option(USE_MYMATH "Use my math" ON)
      
      • 1

      上述设置了一个cmake中的宏USE_MYMATH,这个可以在cmake中使用。

    • 然后为了能在cpp中使用,还需要新建一个config文件,需要在CMakeLists.txt指定config文件:

      configure_file(
      "${PROJECT_SOURCE_DIR}/config.h.in"
      "${PROJECT_SOURCE_DIR}/config.h")
      
      • 1
      • 2
      • 3

      上述意思是cmake在执行的时候将config.h.in文件拷贝一份,重命名为config.h文件,这样就可以在cpp中通过#include引用了。另外,还需要在config.h.in中加入:

      #cmakedefine USE_MYMATH
      
      • 1

      这个表示使用cmake来定义一个宏。

    • 接着,还需要在CMakeLists.txt中使用这个宏:

      if (USE_MYMATH)
      include_directories("${PROJECT_SOURCE_DIR}/math")
      add_subdirectory(math)
      set(EXTRA_LIBS ${EXTRA_LIBS} mmkl)
      endif(USE_MYMATH)
      
      • 1
      • 2
      • 3
      • 4
      • 5

      表示打开这个宏的话,就链接自己定义的库。

    • 最后,需要在cpp中使用这个宏:

      #include 
      #include "config.h"
      #ifdef USE_MYMATH
      #include "mkl.h"
      #else
      #include 
      using std::sin;
      #endif
      
      int main() {
      	auto x = sin(3.5);
      	std::cout << x << '\n';
      #ifdef USE_MYMATH
      	std::cout << "use my math\n";
      #else
      	std::cout << "use std math\n";
      #endif
      
      return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      这样,在执行cmake时:

      cmake -DUSE_MYMATH=ON 
      
      • 1

      cmake就会自动在config.h中写入:

      #define USE_MYMATH
      
      • 1

      表示使用这个宏。如果执行cmake的时候没有加-DUSE_MYMATH=ON,则就默认不启动这宏,那么在config.h中就会自动写入:

      /* #undef USE_MYMATH */
      
      • 1

      当然,如果对应的cpp中的宏比较少,完全可以不用config.h.in这些文件,完全可以直接在CMakeLists.txt中定义宏:

      if (USE_MYMATH)
      add_definitions(-DUSE_MYMATH) # 直接定义宏,这样在cpp中能够直接使用
      include_directories("${PROJECT_SOURCE_DIR}/math")
      add_subdirectory(math)
      set(EXTRA_LIBS ${EXTRA_LIBS} mmkl)
      endif(USE_MYMATH)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    1. 如果其他依赖模块显式的给出了具体位置,且相对位置不变,那么直接可以用include_directories()等来得到依赖库的头文件位置以及依赖库的名称等。但是如果依赖库的位置不定(特别是linux中),只知道可能在哪些位置,那么cmake有功能可以自动去查找:
      在项目的根目录中创建目录 cmake/modules/ ,在 cmake/modules/ 下创建文件 Findxxx.cmake。注意,其中的xxx是库的名字,如Findmmkl.cmake。然后需要修改对应的变量CMAKE_MODULE_PATH:
      list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
      
      • 1
      这个就是存储所有module的变量。详细请看:https://blog.csdn.net/qq_40715157/article/details/124596891
  • 相关阅读:
    中国DevOps平台市场,华为云再次位居领导者位置
    rxjs 关于防抖的方法列举说明
    HTML学生中秋节日网页设计模板 DIV布局大学生中秋节网页作业制作 八月十五中秋静态网页成品代码下载 中秋节日网页设计作品
    Android 打开通知中心(StatusBar)
    视频监控接入汇聚平台的接入和汇聚,在应急管理场景的应用和解决方案
    08-流媒体-RTMP拉流
    云原生周刊:Score 成为 CNCF 沙箱项目|2024.7.15
    PHP对接企业微信审批回调
    竞赛选题 基于机器学习与大数据的糖尿病预测
    9.03 Day45---搭建Vue开发环境,NPM工具使用,Vue工程创建,启动,打包,部署
  • 原文地址:https://blog.csdn.net/weixin_43376501/article/details/126243566