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 )
- 参考文献:
CMake Error Could not find CMAKE_ROOT
出现的bug解决办法hash -r
sudo apt-get/yum remove cmake cmake-data