CMakeList使用总结
一、cmake功能介紹
cmake是跨平臺編譯工具,編寫簡單好維護,是make的高級用法。
1.編寫CMakeList.txt文件,通過cmake生成Makefile文件,make生成可執行文件、靜態庫、共享庫。
2.cmake是一個跨平臺的編譯工具,可以用簡單的語句來描述所有平臺編譯。make工具依賴于平臺,GNU make,Qt qmake,MS nmake,BSD pmake,makepp等等,這些不同make工具遵循不同的規范標準,所有執行的Makefile文件格式格式不同。
在線幫助文檔:https://cmake.org/documentation
3. cmake比configure優秀
configure也是跨平臺編譯工具,使用比較繁瑣.configure腳本為了讓一個程序能夠在各種不同類型的機器上運行而設計的。在使用make編譯源代碼之前,configure會根據自己所依賴的庫而在目標機器上進行匹配。約定俗成的,所有的configure腳本都把腳本文件名起為configure,一般來講都是shell腳本,根據所在的系統環境生成makefile文件。有時候看到一些程序的configure內容超級之多,讓人難以看下去。configure腳本運行時掃描當前環境,生成一個名為config.status的子腳本。子腳本將Makefile.in文件轉換為適應于當前系統環境的Makefile文件。
GNU build system這個工具能夠幫助我們生成configure腳本,又叫做Autotools。Autotools包含的命令有autoconf,automake,libtool。
二、CMakeLists編寫介紹
1.指定運行配置cmake最低版本: cmake_minimum_required(VERSION 3.13)
2.設置工程名稱: project(Test) 獲取${PROJECT_NAME}
3.設置變量: SET(VAR 1) ${變量名}
4.獲取系統環境變量:
5.指定可執行文件生成路徑:
SET(EXECUTABLE_OUTPUT_PATH "xxx/bin")6.指定輸出動態庫的目錄位置:
SET(LIBRARY_OUTPUT_PATH "xxx/lib")7.獲取源代碼、頭文件路徑:
FILE(GLOB SRC_LIST "${PROJECT_SOURCE_DIR}/src/*.cpp") FILE(GLOB HEAD_LIST "${PROJECT_SOURCE_DIR}/include/*.h")8.添加頭文件路徑:
include_directories("${PROJECT_SOURCE_DIR}/include")9.添加鏈接庫路徑:
link_directories("${PROJECT_SOURCE_DIR}/lib")10.添加生成可執行文件:
add_executable(${PROJECT_NAME} ${SRC_LIST} ${HEAD_LIST})11.鏈接庫名:
target_link_libraries(${PROJECT_NAME} ${LIB_NAME})12.添加生成動態庫或靜態庫: 不寫默認靜態庫
add_library(${LIB_NAME} SHARED ${PROJECT_SOURCE_DIR}/third/test.cpp) add_library(${LIB_NAME}_static STATIC ${PROJECT_SOURCE_DIR}/third/test.cpp)13.靜態庫的輸出名稱:
set_target_properties(${LIB_NAME}_static PROPERTIES OUTPUT_NAME ${LIB_NAME})14.設置預處理宏開關 開啟:
option(USE_TEST "option for test" ON)15.配置一個頭文件用于傳遞一些CMake中的配置到源代碼中
configure_file("${PROJECT_SOURCE_DIR}/config.in" "${PROJECT_SOURCE_DIR}/config.h")16.make install
16.1安裝可執行文件、靜態庫、動態庫。
16.2安裝整個目錄
install(DIRECTORY ${OUT_PATH} DESTINATION ${PROJECT_SOURCE_DIR})install(DIRECTORY ${OUT_PATH} DESTINATION ${PROJECT_SOURCE_DIR}PATTERN "${EXE_NAME}" PERMISSIONSOWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)16.3安裝文件
install(FILES "${PROJECT_BINARY_DIR}/bin/${EXE_NAME}" DESTINATION "${PROJECT_SOURCE_DIR}/bin" PATTERN "${EXE_NAME}" PERMISSIONS OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)install(FILES "${PROJECT_BINARY_DIR}/lib/lib${LIB_NAME}.a" DESTINATION "${PROJECT_SOURCE_DIR}/lib")install(FILES "${PROJECT_BINARY_DIR}/lib/lib${LIB_NAME}.so" DESTINATION "${PROJECT_SOURCE_DIR}/lib")三、CMakeList構建Qt工程
1.設置開啟MOC UIC RCC編譯器
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")2.添加qt模塊 添加頭文件路徑 依賴庫路徑 庫名稱 Findxxx.cmake xxxConfig.cmake
find_package(Qt5Widgets CONFIG REQUIRED) target_link_libraries(${PROJECT_NAME} Qt5::Widgets) <NAME>_FOUND <NAME>_INCLUDE_DIRS or <NAME>_INCLUDES <NAME>_LIBRARIE or <NAME>_LIBRARIES or <NAME>_LIBS <NAME>_DEFINITIONS =================================== find_package(PkgConfig) pkg_search_module(Qt5Widgets REQUIRED Qt5Widgets) target_link_libraries(${PROJECT_NAME} ${Qt5Widgets_LIBRARIES}) ===================================================== (pkg-config xxx a.默認usr/bin/*.pc b.讀取環境變量PKG_CONFIG_PATH c.pkg-config --variable pc_path pkg-config ) (動態庫 a.LD_LIBRARY_PATH b./etc/ld.so.conf c./lib or /usr/lib)四、CMakeList添加第三方庫
1.編寫編譯安裝腳本 命名為uchartdet_install.sh
cd libiconv-1.16 path=”`pwd`/../lib” #生成路徑自己指定 ./configure --enable-extra-encodings --prefix=$path --enable-static --disable-shared make make install2.在第三方庫third目錄下編寫CMakeList.txt
execute_process(COMMAND bash "${CMAKE_CURRENT_SOURCE_DIR}/uchartdet_install.sh" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})3.在上級CMakeList.txt添加add_subdirectory(third)
相關demo文檔下載:https://download.csdn.net/download/wml00876/19671522
簡單demo
#最低cmake版本 cmake_minimum_required(VERSION 3.0) #項目名 project(aqp) #引入文件 file(GLOB HEADS "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp") file(GLOB SRCS "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/*.qrc") #添加Qt模塊 find_package(Qt5Core REQUIRED) find_package(Qt5Widgets REQUIRED) #創建可執行文件 add_executable(aqp ${HEADS} ${SRCS} ) #引用路徑,包含編譯給定目標時需要使用的目錄 target_include_directories(${PROJECT_NAME} PUBLIC ${Qt5Core_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} )總結
以上是生活随笔為你收集整理的CMakeList使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从微信云托管容器镜像的选择-alpine
- 下一篇: Eclipse Java IDE 和