cmake学习笔记 一

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

    set(INC_DIRS ${INC_DIRS} aaa)
    set(INC_DIRS ${INC_DIRS} bbb)
    

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

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

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

    option(USE_MYMATH "Use my math" ON)
    

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

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

    configure_file(
    "${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_SOURCE_DIR}/config.h")
    

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

    #cmakedefine USE_MYMATH
    

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

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

    if (USE_MYMATH)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIBS} mmkl)
    endif(USE_MYMATH)
    

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

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

    #include <iostream>
    #include "config.h"
    #ifdef USE_MYMATH
    #include "mkl.h"
    #else
    #include <cmath>
    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;
    }
    

    这样,在执行cmake时:

    cmake -DUSE_MYMATH=ON 
    

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

    #define USE_MYMATH
    

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

    /* #undef USE_MYMATH */
    

    当然,如果对应的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. 如果其他依赖模块显式的给出了具体位置,且相对位置不变,那么直接可以用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")
    
    这个就是存储所有module的变量。详细请看:https://blog.csdn.net/qq_40715157/article/details/124596891
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值