-
cmake中可以通过set()函数来设置变量,进而,可以通过set()函数来设置数组。比如多个需要将多个头文件路径存放到一个变量里面,可以这样:
set(INC_DIRS ${INC_DIRS} aaa) set(INC_DIRS ${INC_DIRS} bbb)
这样,就将所有的值全部设置到了INC_DIRS中了(变成了一个数组)
-
如何添加宏定义:
如何在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)
- 如果其他依赖模块显式的给出了具体位置,且相对位置不变,那么直接可以用include_directories()等来得到依赖库的头文件位置以及依赖库的名称等。但是如果依赖库的位置不定(特别是linux中),只知道可能在哪些位置,那么cmake有功能可以自动去查找:
在项目的根目录中创建目录 cmake/modules/ ,在 cmake/modules/ 下创建文件 Findxxx.cmake。注意,其中的xxx是库的名字,如Findmmkl.cmake。然后需要修改对应的变量CMAKE_MODULE_PATH:
这个就是存储所有module的变量。详细请看:https://blog.csdn.net/qq_40715157/article/details/124596891list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")