設置cmake版本
cmake_minimum_required (VERSION 3.8)
設置項目名稱
project ("CMakeProject1")
設置參數
設置c++ 11 支持
// 設置c++ 11 支持
set(CMAKE_CXX_STANDARD 11)
// 設置開啟標准要求
set(CMAKE_CXX_STANDARD_REQUIRED ON)
// 關閉c++ 擴展
set(CMAKE_CXX_EXTENSIONS OFF)
安裝目錄
//CMAKE_INSTALL_PREFIX變量類似於configure腳本的 –prefix
set(CMAKE_INSTALL_PREFIX .)
set(CMAKE_INSTALL_PREFIX /usr .)
支持cuda
find_package(CUDA)
設置參數及目錄
// 以 nvidia video sdk 為例
// 設置參數地址
set(NVCODEC_PUBLIC_INTERFACE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Interface)
set(NVCODEC_UTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utils)
set(NV_CODEC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/NvCodec)
set(NV_ENC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/NvCodec/NvEncoder)
set(NV_DEC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/NvCodec/NvDecoder)
set(NV_APPENC_COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AppEncode/Common)
set(NV_APPDEC_COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AppDecode/Common)
根據當前系統設置不同的參數
// CMAKE_SIZEOF_VOID_P 是判斷依據 4代表32位 8代表64位
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
else()
endif()
// WIN32 是判斷依據 true是windows平台 false是其他平台
if(WIN32)
else ()
endif()
// CMAKE_SYSTEM_NAME 是判斷依據 Linux是Linux平台
// STREQUAL 是 CMAKE 的關鍵字,用於字符串比較
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
endif()
通過PkgConfig搜索添加庫
// 通過PkgConfig搜索庫文件
find_package(PkgConfig REQUIRED)
// 檢索PC_AVCODEC REQUIRED:如果找不到模塊,命令將失敗並報錯(QUIET:不會打印任何狀態消息) IMPORTED_TARGET:創建一個名為PkgConfig::< prefix>的導入目標,該目標可以作為參數直接傳遞給target_link_libraries()
pkg_check_modules(PC_AVCODEC REQUIRED IMPORTED_TARGET libavcodec)
pkg_check_modules(PC_AVFORMAT REQUIRED IMPORTED_TARGET libavformat)
pkg_check_modules(PC_AVUTIL REQUIRED IMPORTED_TARGET libavutil)
pkg_check_modules(PC_SWRESAMPLE REQUIRED IMPORTED_TARGET libswresample)
通過find_library查找庫 一般是Linux下
// AVCODEC_LIBRARY:創建名為的緩存條目以存儲此命令的結果,如果找到了庫,結果將存儲在變量中,除非清除變量,否則將不
// 會重復搜索,如果什么也沒找到,結果將是-NOTFOUND,REQUIRED如果未找到任何內容,該選項將停止處理並顯示一條錯誤消息,
// 否則,下次使用相同的變量調 用find_library時,將再次嘗試搜索.
// NAMES 為庫指定一個或多個可能的名稱。
// HINTS, PATHS 除了默認位置,還指定要搜索的目錄。該子選項讀取系統環境變量的路徑。
// DOC 指定緩存條目的文檔字符串。
find_library(AVCODEC_LIBRARY NAMES avcodec
HINTS
${PC_AVCODEC_LIBDIR}
${PC_AVCODEC_LIBRARY_DIRS}
)
引用路徑
include_directories()
target_include_directories()
add_executable( xx.cpp xx.h)
這三種方式都可以對當前項目添加引用路徑。
include_directories
影響范圍最大,可以為CMakelists.txt后的所有項目添加頭文件目錄
一般寫在最外層CMakelists.txt中影響全局
target_include_directories
影響范圍可以自定義。如加關鍵子PRIVATE或這PUBLIC。
一般引用庫路徑使用這個命令,作為外部依賴項引入進來,target是自己項目生成的lib。
project(myLib)
target_include_directories(myLib PRIVATE ${OpenCV_Include_dir})
add_executable
添加的引用路徑一般是當前目錄下的源文件對應的頭文件。是生成項目時引入的頭文件。
這種方式一般用於自己寫的或某項目需要的頭文件,這種方式需要加添加文件名字,而非頭文件目錄
project(addFunc)
add_executable(addFunc addFunc.h addFunc.cpp)
聲明引入子項目(目錄)
add_subdirectory(onedll)
添加宏定義
add_definitions()
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
添加到cuda
// 可執行程序
cuda_add_executable()
// 庫
CUDA_ADD_LIBRARY()
配置安裝目錄
install(TARGETS MyLib
EXPORT MyLibTargets
LIBRARY DESTINATION lib # 動態庫安裝路徑
ARCHIVE DESTINATION lib # 靜態庫安裝路徑
RUNTIME DESTINATION bin # 可執行文件安裝路徑
PUBLIC_HEADER DESTINATION include # 頭文件安裝路徑
)
連接庫的頭文件路徑
target_link_libraries(${PROJECT_NAME} ${CUDA_CUDA_LIBRARY} ${CMAKE_DL_LIBS} ${NVENCODEAPI_LIB} ${CUVID_LIB} ${AVCODEC_LIB}
${AVFORMAT_LIB} ${AVUTIL_LIB} ${SWRESAMPLE_LIB})
自定義命令
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${FFMPEG_DLL_DIR} ${NVCODEC_SAMPLES_INSTALL_DIR}/$<CONFIG>/)