Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

cmake

https://www.jianshu.com/p/cdd6e56c2422

指定编译标准

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编译

评论