从来没见过语法像CMake这么烂的DSL,构建项目的时候总是要去查文档,但是查了文档还是不知道该怎么办💢,这里记一下自己常用的一些写法。

有用的Tutorial

cmake cook book

都塞到lib里吧!

如果我们希望生成的lib能够在制定的目录出现,那么我们需要在最顶层的CMakeList里加上:

SET (LIBRARY_OUTPUT_PATH_ROOT ${PROJECT_SOURCE_DIR}/lib)

这样,我们在项目中生成的lib文件就会自动的生成到项目主目录下的lib目录了,如下:

image-20220211145901447

如果在Cmake里进行了lib的创建:

add_library(${PROJECT_NAME} SHARED
        src/Interface.cpp
        src/tools.cpp
        src/Parser.cpp)

则该lib文件会在lib目录下产生。

创建cmake目录

一些项目的主目录下会有cmake这个目录,具体来讲里面会存放一些cmake文件,大概存放的内容一般有:

  1. 一些cmake的指令文件,例如一般来讲检查环境来设置变量的check.cmake,用来引入外部库的xxx.cmake,使用的方法也很简单,直接include绝对路径即可

    # Do check list
    include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/check.cmake")

    或者提前制定好cmake的module path,这样可以直接用文件名完成任务:

    set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
    include(lexy)
  2. 另外一种很常见的是在这个目录下再放一个module文件夹,里面存放的是一些查找Pakcage的Find脚本,例如FindCUDNN.cmake之类的,在CMakeList里通过FIND_PACKAGE(CUDNN REQUIRED)就会自动的调用FindCUDNN来找到CUDNN并设置XXX_FOUND、XXX_INCLUDE等变量。

    find_package(Threads)
    target_link_libraries(calc-cpu-flops fpkernel ${CMAKE_THREAD_LIBS_INIT})

用变量表示目录下的一堆文件

file(GLOB LIB_SOURCE "${CMAKE_CURRENT_LIST_DIR}/cpufp_kernel_*.s")
add_library(fpkernel ${LIB_SOURCE})

添加header目录

include_directories(${PROJECT_SOURCE_DIR})
include_directories(
        ${PROJECT_SOURCE_DIR}/include
)

Find Libs

openmpi

find_package(MPI REQUIRED)
add_executable(hello-mpi hello-mpi.cpp)

target_link_libraries(hello-mpi
  PUBLIC
 	  MPI::MPI_CXX
  )

openmp

find_package(OpenMP REQUIRED)

if (OPENMP_FOUND)
    include_directories("${OPENMP_INCLUDES}")
    link_directories("${OPENMP_LIBRARIES}")
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif(OPENMP_FOUND)

一些小问题

  1. Remote SSH的时候,可能有时候会出现环境配置没有问题,但是头文件在clion里就是找不到,会出现红色的下划线

    解决:Tools | Resync with Remote Hosts