Cmake学习

 

vcpkg通过将环境变量设置VCPKG_ROOT为指向其路径或使用cmake参数,可以在所有主要平台上自动获取和构建依赖项-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake

 

 

 

2. target

通过设置target的属性ARCHIVE_OUTPUT_DIRECTORY,LIBRARY_OUTPUT_DIRECTORY和RUNTIME_OUTPUT_DIRECTORY为指定输出目录。对于多配置的generator,cmake会附加每个配置的子目录到指定输出目录。如果不希望将不同配置下生成的target放置到各自配置的子目录中,可以同时设置target的属性ARCHIVE_OUTPUT_DIRECTORY_<CONFIG>,LIBRARY_OUTPUT_DIRECTORY_<CONFIG>和RUNTIME_OUTPUT_DIRECTORY_<CONFIG>。上述属性分别作用于三种不同类型target的输出:可执行文件总是被作为RUMTIME target,静态库总是被作为ARCHIVE target,Module库总是被作为LIBRARY target,在Windows平台,shared library的DLL部分作为RUNTIME target,对应的Import library作为ARCHIVE target。如要输出所有配置的可执行target到${CMAKE_BINARY_DIR}/bin目录中,

set_target_properties(${EXECUTABLE_TARGET} PROPERTIES
                          RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}"
                          RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}"
                          RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${PROJECT_BINARY_DIR}"
                          RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${PROJECT_BINARY_DIR}")

set_target_properties(cudaSift PROPERTIES
                      OUTPUT_NAME cudaSift
                      LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

 

cmake: fatal error: cuda_runtime.h:

find_package(CUDA  REQUIRED)
include_directories("${CUDA_INCLUDE_DIRS}")

 

搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中。

AUX_SOURCE_DIRECTORY(src DIR_SRCS)
SET(SRC_DIR ${DIR_SRCS})

 

get_filename_component 得到一个完整文件名中的特定部分。

get_filename_component(<VAR> FileName
PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
[CACHE])

将变量<VAR>设置为路径(PATH),文件名(NAME),文件扩展名(EXT),去掉扩展名的文件名(NAME_WE),完整路径(ABSOLUTE),或者所有符号链接被解析出的完整路径(REALPATH)。注意,路径会被转换为Unix的反斜杠(/),并且没有结尾的反斜杠。该命令已经考虑了最长的文件扩展名。如果指定了CACHE选项,得到的变量会被加到cache中。

 

 

 

CMakeLists.txt 样例

cmake_minimum_required(VERSION 3.10)

project(fusion CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# opencv
FIND_PACKAGE(OpenCV REQUIRED)
if (OPENCV_FOUND)
    include_directories(${OpenCV_INCLUDE_DIRS})
endif (OPENCV_FOUND)

# 多线程
# find_package(Threads)

# Eigen
find_package(Eigen3 3.3 REQUIRED)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${EIGEN3_INCLUDE_DIR})

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRCS_DIR)





file(GLOB exam_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/app/*.cpp)
foreach(example_file ${example_files})

    get_filename_component(example_name ${example_file} NAME_WE)
    add_executable(${example_name} ${example_file} ${SRC_DIR})
    target_link_libraries(${example_name} ${EXTRA_LIBS} ${OpenCV_LIBS} -lpthread -ldl)

endforeach(example_file ${example_files})

 

 

 file(GLOB variable [RELATIVE path] [globbingexpressions]...)

GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中。Globbing 表达式与正则表达式类似,但更简单。如果指定了RELATIVE 标记,返回的结果将是与指定的路径相对的路径构成的列表。 (通常不推荐使用GLOB命令来从源码树中收集源文件列表。原因是:如果CMakeLists.txt文件没有改变,即便在该源码树中添加或删除文件,产生的构建系统也不会知道何时该要求CMake重新产生构建文件。globbing 表达式包括:

   *.cxx     - match all files with extension cxx
   *.vt?      - match all files with extension vta,...,vtz
   f[3-5].txt - match files f3.txt,f4.txt, f5.txt

 

posted @ 2021-04-24 21:22  小小灰迪  阅读(209)  评论(0编辑  收藏  举报