cmake
指定编译标准
CXX标准
set(CMAKE_CXX_STANDARD 14) # c++14
PROJECT
基本用法:指定工程名称(完成路径赋值)
# 顶层CMakeLists.txt
cmake_minimum_required (VERSION 3.10.2)
project (mytest)
指定当前的工程名称为mytest
。实际上在调用project命令指定当前工程名字的同时,cmake内部会为如下变量赋值:
PROJECT_NAME
:将当前工程的名称赋值给PROJECT_NAME
,对于本例子,就是${PROJECT_NAME}=mytest
。PROJECT_SOURCE_DIR
:当前工程的源码路径。<PROJECT-NAME>_SOURCE_DIR
:指定工程的源码路径,这个变量和PROJECT_SOURCE_DIR
的区别就是,<PROJECT-NAME>_SOURCE_DIR
跟具体的工程名字关联起来,若<PROJECT-NAME>
就是当前工程,则该变量和PROJECT_SOURCE_DIR
相等。PROJECT_BINARY_DIR
:当前工程的二进制路径。<PROJECT-NAME>_BINARY_DIR
:指定工程的二进制路径,这个变量和PROJECT_BINARY_DIR
的区别就是,<PROJECT-NAME>_BINARY_DIR
跟具体的工程名字关联起来,若<PROJECT-NAME>
就是当前工程,则该变量和PROJECT_BINARY_DIR
相等。CMAKE_PROJECT_NAME
:顶层工程的名称。例如当前调用的CMakeLists.txt位于顶层目录(可以理解为使用cmake命令首次调用的那个CMakeLists.txt),那么工程名还会赋值给CMAKE_PROJECT_NAME
。
变量
cmake变量定义的方式有两种:隐式定义和显式定义。
- 隐式定义
前面举了一个隐式定义的例子,就是PROJECT指令,他会隐式的定义_BINARY_DIR和_SOURCE_DIR两个变量。 - 显示定义
显式定义的例子我们前面也提到了,使用 SET 指令,就可以构建一个自定义变量了。比如:
s(HELLO_SRC main.c)
就可以通过${HELLO_SRC}来引用这个自定义变量(main.c)了.
举例
设置编译参数,指定拿哪些文件build:
cmake_minimum_required( VERSION 2.8 ) project(disjoint_path) set(CMAKE_CXX_STANDARD 11) # 设置编译参数 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -rdynamic -pthread") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) include_directories(${PROJECT_SOURCE_DIR}) include_directories(${PROJECT_BINARY_DIR}) # set self-define var set(MAIN_FILE_LIST # 目录结构:这些文件都和CMakeLists.txt在项目顶层目录下,同级 main.cpp TwoConnected.cpp TwoConnected.h Graph.cpp Graph.h config.h ) # add_executable add_executable(main ${MAIN_FILE_LIST})
如何编译:
# 项目顶层目录下 mkdir build & cd build cmake .. make main
链接库和链接参数:
cmake_minimum_required(VERSION 3.15) project(rdb_example) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -rdynamic -pthread") add_executable(simple_rdb_eg simple_adjlist.cpp) # 目录结构:simple_adjlist.cpp和CMakeLists.txt在项目顶层目录下,同级 target_link_libraries(simple_rdb_eg librocksdb.a -lpthread -llz4 -lsnappy -lbz2 -lzstd -ldl libz.so) #librocksdb.a已经设置$PATH可以通过环境变量$PATH找到
make simple_rdb_eg
编译