cmake:支持跨平台,生成makefile的构建工具。
本文讲解程序cmake方式编译方法,并提供单个demo编译示例。
下一篇文章中对于cmake库,执行文件,通用三方库配置方式,以及编译等级进行讲解
基本语法
- 指定cmake版本
cmake_minimum_required(VERSION 3.5)
- 项目名称标记
project(app [LANGUAGES CXX/C])
- 导入cmake脚本
include(${cmake_root_dir}/common.cmake)
- 设置头文件路径
include_directories(include)
include_directories(include/inner)
include_directories(include/import)
include_directories(include/export)
- 设置预编译源代码目录
add_subdirectory(src)
- 设置链接路径(需要在链接之前,用于配置编译时查找路径)
link_directories(${3rdparty_dir})
- 消息打印
STATUS: 这是最常见的消息类型,用于输出常规的进度信息。例如:
message(STATUS "This is a CMake message.")
WARNING: 此类型的消息用于输出警告信息,或者当遇到非严重错误时。例如:
message(WARNING "This is a CMake warning message.")
AUTHOR_WARNING: 此类型的消息类似于 WARNING,但会忽略通过 -Wno-dev 参数设置的警告。例如:
message(AUTHOR_WARNING "This is an author warning message.")
FATAL_ERROR: 此类型的消息用于严重的错误。在消息输出后,CMake将立即停止处理。例如:
message(FATAL_ERROR "This is a CMake fatal error message.")
SEND_ERROR: 类似于 FATAL_ERROR,但是CMake进程将继续执行以到达预定目标,然后停止。例如:
message(SEND_ERROR "This is a CMake send error message.")
要调用message(),你可以按照类型在消息字符串前面添加关键字,如 message(STATUS “Configuring…”)。如果没有指定类型,CMake将默认为STATUS。
打印所有头文件路径
get_property( dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES )
foreach( dir ${dirs} )
message( STATUS "include dir=${dir}" )
endforeach()
9.开启库/执行文件编译
add_library(${PROJECT_NAME}
main.cpp
)
add_executable(${PROJECT_NAME}
main.cpp
)
10.链接
target_link_libraries(${PROJECT_NAME} PRIVATE ${Link_Lib})
- 添加运行时动态查找路径
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-Wl,--disable-new-dtags,-rpath, ${rtpath})
完整示例
cmake_minimum_required(VERSION 3.5)
project(app LANGUAGES CXX)
if(NOT DEFINED PLATFORM_TYPE)
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
set(PLATFORM_TYPE "windows")
else()
set(PLATFORM_TYPE "linux")
endif()
endif()
set(cmake_root_dir ${CMAKE_SOURCE_DIR}/cmake)
if(NOT EXISTS ${cmake_root_dir})
message(FATAL_ERROR "cmake_root_dir: ${cmake_root_dir} not found")
else()
include(${cmake_root_dir}/common.cmake)
endif()
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
set(PTHREAD_LIB pthreadVC2)
include_directories(include/import/pthread)
else()
set(PTHREAD_LIB "")
endif()
# opencv
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
set(OPENCV_BUILD_PATH ${3rdparty_dir}/opencv47_win_lib)
set(OPENCV_INCLUDE_PATH include/import/opencv)
set(OPENCV_BUILD_LIBS opencv_world320 )
else()
if(DEFINED QL)
set(OPENCV_BUILD_PATH /home/HZ/opencv4_7_build )
set(OPENCV_INCLUDE_PATH ${OPENCV_BUILD_PATH}/include/opencv4)
set(OPENCV_BUILD_LIBS opencv_calib3d opencv_core opencv_features2d opencv_flann opencv_highgui opencv_imgcodecs opencv_imgproc opencv_ml opencv_objdetect opencv_photo opencv_stitching opencv_videoio opencv_video )
else()
set(OPENCV_BUILD_PATH /home/ssc/opencv4_7_world_crop_build)
set(OPENCV_INCLUDE_PATH ${OPENCV_BUILD_PATH}/include/opencv4)
set(OPENCV_BUILD_LIBS opencv_world )
# set(OPENCV_BUILD_LIBS opencv_calib3d opencv_core opencv_features2d opencv_flann opencv_highgui opencv_imgcodecs opencv_imgproc opencv_ml opencv_objdetect opencv_photo opencv_shape opencv_stitching opencv_superres opencv_videoio opencv_video opencv_videostab)
endif()
message(STATUS "OPENCV_BUILD_PATH: ${OPENCV_BUILD_PATH}")
endif()
# json
set(JSON_PATH /home/ssc/nlohmann)
include_directories(${CMAKE_SOURCE_DIR})
include_directories(include)
include_directories(include/import)
include_directories(${JSON_PATH})
include_directories(${OPENCV_INCLUDE_PATH})
get_property( dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES )
foreach( dir ${dirs} )
message( STATUS "include dir=${dir}" )
endforeach()
link_directories(${OPENCV_BUILD_PATH}/lib)
link_directories(${3rdparty_dir})
link_directories(/home/rlclatr/52pod/M-208-release/app/lib)
if(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
message(STATUS "link_directories: ${OPENCV_BUILD_PATH}/lib ${3rdparty_dir} ${lib_dir}")
else()
message(STATUS "link_directories: ${OPENCV_BUILD_PATH}/lib ${3rdparty_dir} ${lib_dir}")
endif()
add_executable(${PROJECT_NAME}
com_code.cpp
command_parser.cpp
recorddisplay.cpp
main.cpp
)
target_compile_options(${PROJECT_NAME} PRIVATE -fPIC)
set(Link_Lib pthread enjoy ${OPENCV_BUILD_LIBS} )
target_link_libraries(${PROJECT_NAME} PRIVATE ${Link_Lib})
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-Wl,--disable-new-dtags,-rpath,./:/homerpath")
message(STATUS "Link_Lib: ${Link_Lib}")