【一】cmake构建完整流程讲解

cmake:支持跨平台,生成makefile的构建工具。
本文讲解程序cmake方式编译方法,并提供单个demo编译示例。

下一篇文章中对于cmake库,执行文件,通用三方库配置方式,以及编译等级进行讲解

基本语法

  1. 指定cmake版本
cmake_minimum_required(VERSION 3.5)
  1. 项目名称标记
 project(app [LANGUAGES CXX/C])
  1. 导入cmake脚本
include(${cmake_root_dir}/common.cmake)
  1. 设置头文件路径
include_directories(include)
include_directories(include/inner)
include_directories(include/import)
include_directories(include/export)
  1. 设置预编译源代码目录
add_subdirectory(src)
  1. 设置链接路径(需要在链接之前,用于配置编译时查找路径)
link_directories(${3rdparty_dir})
  1. 消息打印
    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})
  1. 添加运行时动态查找路径
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}")
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值