• 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
  • 相关阅读:
    BIM算量与传统算量软件的对比和模型精准解决方案
    基于生物激励神经网络的室内实时激光SLAM控制方法
    Zookeeper选举Leader源码剖析(上)
    《TCP/IP网络编程》阅读笔记--epoll的使用
    threejs 3D标注
    npm run dev和npm run build调用api返回的数据不一致(build后调用api返回index.html)
    FPGA实现“乒乓操作”
    【数据机构】最小生成树(prim算法)
    Elasticsearch:什么是 DevOps?
    张一鸣 12 万字观点整理
  • 原文地址:https://blog.csdn.net/weixin_43376501/article/details/126243566