cmake學習(一) CMakeLists.txt 配置參數


設置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>/)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM