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
#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;
}
这样,在执行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)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")