cmake学习笔记之跨平台编译

本文提供了一个适用于中小项目的CMakeLists.txt模板,支持跨平台编译,并详细配置了针对Windows、Linux及ARM平台的编译选项。该模板还包含了OpenCV库的集成方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMakeLists模板

  • 适用于c/c++中、小项目的编译环境
  • 适用于跨平台编译,支持windows Debug或Release版本
  • 模板如下:
cmake_minimum_required(VERSION 3.1)
project(you_project_name)

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/gcc")

if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "Build type not set - using RelWithDebInfo")
  set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose build type: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()


message(${CMAKE_HOST_SYSTEM_NAME})
message(${CMAKE_HOST_SYSTEM_PROCESSOR})

if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
    message("this is Linux")
elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Android")
	message("this is Android")
endif()
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
    message("this is aarch64 cpu")
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")
	message("this is x86_64 cpu")
endif()
if(MSVC)
  add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
  add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) 
endif()


# macro(safe_set_static_flag)
	# foreach(flag_var
		# CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
		# CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
	  # if(${flag_var} MATCHES "/MD")
		# string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
	  # endif(${flag_var} MATCHES "/MD")
	# endforeach(flag_var)
# endmacro() 

IF (CMAKE_SYSTEM_NAME MATCHES "Linux")  
    MESSAGE(STATUS "current platform: Linux ")  
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")  
    MESSAGE(STATUS "current platform: Windows")    
ELSE ()  
    MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")  
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")  
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows")
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_RELWITHDEBINFO_POSTFIX "rd" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_MINSIZEREL_POSTFIX "s" CACHE STRING "add a postfix, usually empty on windows")
 

# Set the build postfix extension according to what configuration is being built.
IF (CMAKE_BUILD_TYPE MATCHES "Release")
    SET(CMAKE_BUILD_POSTFIX "${CMAKE_RELEASE_POSTFIX}")
ELSEIF (CMAKE_BUILD_TYPE MATCHES "MinSizeRel")
    SET(CMAKE_BUILD_POSTFIX "${CMAKE_MINSIZEREL_POSTFIX}")
ELSEIF(CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
    SET(CMAKE_BUILD_POSTFIX "${CMAKE_RELWITHDEBINFO_POSTFIX}")
ELSEIF(CMAKE_BUILD_TYPE MATCHES "Debug")
    SET(CMAKE_BUILD_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
ELSE()
    SET(CMAKE_BUILD_POSTFIX "")
ENDIF()





set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/)

SET(OPENCV_DIR "" CACHE PATH "Location of libraries")

#定义变量用于编译不同平台,默认值OFF
option (USE_ARM "Use ARM platform implementation" OFF) 
option (USE_LINUX "Use LINUX platform implementation" OFF)

#指定项目中所需的头文件路径
if (EXISTS "${PROJECT_SOURCE_DIR}/include")
    include_directories("${PROJECT_SOURCE_DIR}/include")
endif()

if (MSVC)
#add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
#add_compile_definitions(_CRT_NONSTDC_NO_DEPRECATE)
    add_definitions("_CRT_SECURE_NO_WARNINGS")
    set(CMAKE_C_FLAGS_DEBUG   "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd")
    set(CMAKE_C_FLAGS_RELEASE  "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT")
    set(CMAKE_CXX_FLAGS_DEBUG  "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd")
    set(CMAKE_CXX_FLAGS_RELEASE   "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o2 -fopenmp -std=c++11")
    set(CMAKE_STATIC_LIBRARY_PREFIX "")
endif()


if (NOT DEFINED OPENCV_DIR OR ${OPENCV_DIR} STREQUAL "")
    message(FATAL_ERROR "please set OPENCV_DIR with -DOPENCV_DIR=/path/opencv")
endif()

if (WIN32)
  find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/build/ NO_DEFAULT_PATH)
else ()
  find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH)
endif ()

include_directories(${OpenCV_INCLUDE_DIRS})

if(WIN32)
  if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
    add_compile_definitions(MS_UWP)
  endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
endif(WIN32)

# rpath handling: use rpath in installed binaries
if(NOT CMAKE_SYSTEM_NAME MATCHES Linux)
  set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif()
if ( WIN32 )
	# CMAKE_BUILD_TYPE
	if(NOT CMAKE_BUILD_TYPE)
	    set(CMAKE_BUILD_TYPE "Release" CACHE STRING
	      "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel"
	      FORCE)
	endif()
	message("Windows build start")
	# 指定编译器类型
	set(CMAKE_GENERATOR "Visual Studio 14 2015")

	# window下VS工程将加载源文件的所包含项目中的头文件
	file(GLOB_RECURSE HEAD_FILES  ${CMAKE_CURRENT_SOURCE_DIR}/include/xxx.h) #将xxx换成*
	source_group("Header Files" FILES ${HEAD_FILES}) 
	#指定window所链接的第三方或依赖库的目录
	#link_directories(${PROJECT_SOURCE_DIR}/3rdParty/opencv/x64)

elseif(USE_ARM)
	link_directories(${PROJECT_SOURCE_DIR}/3rdParty/lib/arm)
elseif(USE_LINUX)
	link_directories(${PROJECT_SOURCE_DIR}/3rdParty/lib/linux)
endif()

if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPic -o3")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c++11 -fPic -o3")
endif()


aux_source_directory(${PROJECT_SOURCE_DIR}/src SRCS)
aux_source_directory(${PROJECT_SOURCE_DIR}/3rdParty/src 3RDSRCS)

if ( WIN32 )
	SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows")
	SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
	
	add_library(${you_project_name} SHARED  ${SRCS} ${3RDSRCS } ${HEAD_FILES} ${OpenCV_LIBS})

	if(CMAKE_BUILD_TYPE MATCHES "Release")
	    SET(CMAKE_BUILD_POSTFIX "${CMAKE_RELEASE_POSTFIX}")
	elseif(CMAKE_BUILD_TYPE MATCHES "Debug")
	    SET(CMAKE_BUILD_POSTFIX "${CMAKE_DEBUG_POSTFIX}")
	else()
	    SET(CMAKE_BUILD_POSTFIX "")
	endif()
	target_link_libraries(${PROJECT_NAME}  ${OpenCV_LIBS})

elseif(USE_ARM)
	add_library(${PROJECT_NAME} SHARED  ${SRCS} ${HEAD_FILES} )
	target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} )
elseif(USE_LINUX)
	add_library(${PROJECT_NAME} SHARED  ${SRCS})
	add_library(${PROJECT_NAME}_static STATIC ${SRCS})
	target_link_libraries(${PROJECT_NAME} libname_static.a ${OpenCV_LIBS} )
endif()
add_executable(demo demo.cpp ${HEAD_FILES})
if ( WIN32 )
target_link_libraries(demo   ${PROJECT_NAME} )
else()
target_link_libraries(demo  ${PROJECT_NAME} ${OpenCV_LIBS})
endif()
  • window系统自动运行bat脚本,生成vs工程

    REM @echo off 
    cd %~dp0
    md build_x64
    cd build_x64
    cmake.exe -G "Visual Studio 15 2017" -A x64 -Tv140_xp,host=x64 -DCMAKE_BUILD_TYPE=Release ..
    REM cmake.exe "Visual Studio 14 2015" -A x64 -Tv140_xp,host=x64 -DCMAKE_BUILD_TYPE=Release .. rem表示注释
    cmake --build . --config release
    pause
    exit 
    
  • 包含一些依赖的库或者模块。一个典型的例子是opencv库,它其中包含许多模块,但有些函数功能模块并用不上,可以使用下面的 find_package 命令来链接所需的模块:

find_package(OpenCv COMPONENTS opencv_core opencv_imgproc opencv_imgcodecs REQUIRED)
# 如果包是可选的,可以忽略 REQUIRED 关键字。 
# 以下两条find_package 命令和上述命令等价:
find_package(OpenCv REQUIRED opencv_core opencv_imgproc opencv_imgcodecs)
find_package(OpenCv REQUIRED COMPONENTS opencv_core opencv_imgproc opencv_imgcodecs)

#对于存在有些必选模块和可选模块组件,可调用find_package2次
find_package(OpenCv COMPONENTS opencv_core  opencv_imgcodecs REQUIRED)
find_package(OpenCv COMPONENTS opencv_imgproc )
# 显式地检查必需的模块
find_package(opencv COMPONENTS opencv_core  opencv_imgcodecs)
可以使用 <PACKAGE>_<COMPONENT>_FOUND 变量(如OpenCv_imgcodecs_FOUND)来检查组件是否被找到
if ( NOT OpenCv_FOUND OR NOT imgcodecs_FOUND )
  message(FATAL_ERROR "Package OpenCv and component imgcodecs required, but not found!")
endif( NOT OpenCv_FOUND OR NOT imgcodecs_FOUND )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值