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