自己常用的CMake用法總結


歡迎指正

CMake : 

  A、download : https://cmake.org/download/

  B、tutorial: https://cmake.org/cmake-tutorial/

說明:

  我目前使用的是最新版:3.18 。

 

0、序言

  A、Cmake可配置生成項目

  B、項目可以是庫文件或者可執行文件

  C、僅為參考,好記性不如爛筆頭。

 

1、指定CMake版本相關 cmake_minimum_required

cmake_minimum_required(VERSION 3.1)

  可以用GUI查看版本或者其他方式

  

  上面的示例中,3.1 可以改,其他的,照寫。

 

2、指定工程名project

# 1. set name
project(lib_udp)

  這里的 lib_udp為項目名,自定義即可。

 

3、aux_source_directory

  一個項目可能有多個頭文件或者源文件,但是不想一個個的寫,這時候,aux_source_directory可以很好的解決你的問題,可以用下面的方式

# 2. to get all source files
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src udp_src)

 

4、指定項目頭文件搜索路徑: include_directories

  這里指定的是目錄,不是文件。示例:

1 include_directories(
2 "${CMAKE_CURRENT_SOURCE_DIR}/include"
3 "${CMAKE_CURRENT_SOURCE_DIR}/ext/spdlog-1.x/include"
4 )

 

5、設置選項option

  有了這個, 非常方便編寫CMake相關的代碼,示例,

1 option(example_shared             "an example to show how to use dynamic library" OFF)
2 option(lib_shared                 "to generate dynamic library"                     OFF)
3 option(lib_mfc                     "to generate a dynamic library to support MFC"     ON)
4 option(lib_static                 "an example to show how to use dynamic library" OFF)

  option(變量名   描述字符串       狀態)

  狀態: ON / OFF

  有了這個,用GUI 配置就會顯示如下:

  ON - 勾選,  OFF - 不勾選

  配置一條option, 這里就會顯示一項。

 

6、創建庫項目 add_library

  語法示例如下:

add_library( lib_udp_static STATIC ${udp_src} )

  第一個參數: 項目名 , 第二個參數: 動態庫(SHARED)還是靜態庫(STATIC), 第三個參數:源文件

 

7、鏈接庫 link_libraries

  當項目需要連接到系統庫時,link_libraries 就登場了, 語法示例:

link_libraries(ws2_32)

  參數時 系統庫的名字

 

8、生成可執行程序項目add_executable

  當項目生成的結果時一個可執行程序時,用add_executable指定。

add_executable(exam_lib_dynamic ${exam_src})

  第一個參數: 項目名,  第二個參數, 源文件

 

10、條件語句

  關鍵字: if else elseif  endif, 使用示范

  if (WIN32)
        link_libraries(ws2_32)
    elseif (APPLE)
        link_libraries(pthread)
    elseif (UNIX)
    
    endif (WIN32)

 

 

--------------- 一個 完整的CMAKE 演示------------------------

  1 cmake_minimum_required(VERSION 3.1)
  2 
  3 
  4 SET(CMAKE_C_COMPILER /usr/bin/clang)
  5 SET(CMAKE_CXX_COMPILER /usr/bin/clang++)
  6 
  7 # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -lrt -D_GLIBCXX_USE_NANOSLEEP")
  8 add_definitions(-std=c++11)
  9 
 10 
 11 
 12 # ---------------------------------------------------------------------------------------------------
 13 # 1. set name
 14 project(lib_udp)
 15 
 16 
 17 
 18 
 19 # ---------------------------------------------------------------------------------------------------
 20 # 2. to get all source files
 21 aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src udp_src)
 22 
 23 
 24 
 25 
 26 # ---------------------------------------------------------------------------------------------------
 27 # 3. to attach to path of includes direcotries
 28 include_directories(
 29 "${CMAKE_CURRENT_SOURCE_DIR}/include"
 30 "${CMAKE_CURRENT_SOURCE_DIR}/ext/spdlog-1.x/include"
 31 )
 32 
 33 
 34 
 35 # ---------------------------------------------------------------------------------------------------
 36 #4. set some options
 37 option(example_shared             "an example to show how to use dynamic library" OFF)
 38 option(lib_shared                 "to generate dynamic library"                     OFF)
 39 option(lib_mfc                     "to generate a dynamic library to support MFC"     ON)
 40 option(lib_static                 "an example to show how to use dynamic library" OFF)
 41 
 42 
 43 
 44 set(headers    
 45     ${CMAKE_CURRENT_SOURCE_DIR}/include/udp/udp_socket_imp.h
 46     ${CMAKE_CURRENT_SOURCE_DIR}/include/udp/udp_wsa.h
 47     ${CMAKE_CURRENT_SOURCE_DIR}/include/udp/udpsocket_interface.h
 48 )
 49 
 50 
 51 SOURCE_GROUP("Header Files" FILES ${headers})
 52 
 53 # ---------------------------------------------------------------------------------------------------
 54 #5. dynamic library program
 55 if(lib_shared)
 56     # 5.1 to link library
 57     if (WIN32)
 58         link_libraries(ws2_32)
 59     elseif (APPLE)
 60         link_libraries(pthread)
 61     elseif (UNIX)
 62     
 63     endif (WIN32)
 64 
 65     # 5.2 to create static library
 66     if(lib_static)
 67         add_library( lib_udp_static STATIC ${udp_src} )
 68     endif(lib_static)
 69 
 70     # 5.3 default to create dynamic library
 71     add_library( lib_udp_shared SHARED ${udp_src} )
 72     
 73     # 5.4 set others 
 74     set_property(TARGET lib_udp_shared PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
 75 endif(lib_shared)
 76 
 77 
 78 
 79 # ---------------------------------------------------------------------------------------------------
 80 #6. to support MFC 
 81 if(lib_mfc)
 82 
 83     # 6.1 set some flags
 84     if(WIN32)
 85         link_libraries(ws2_32)
 86         # set charators unicode
 87         Add_Definitions(-DUNICODE -D_UNICODE)
 88         Add_Definitions(-D_AFC_DLL)
 89         SET(CMAKE_MFC_FLAG 2)    
 90     endif(WIN32)
 91     
 92     # 6.2 to create an tatic library 
 93     if(lib_static)
 94         add_library( mfc_lib_udp_static STATIC ${udp_src} )
 95     endif(lib_static)
 96     
 97     #6.3 to create dynamic library    
 98     add_library( mfc_lib_udp_shared SHARED ${udp_src} )
 99     
100     # 6.4 set others 
101     set_property(TARGET mfc_lib_udp_shared PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
102 
103     #6.5 
104     if(lib_static)
105         SET_TARGET_PROPERTIES (mfc_lib_udp_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
106     endif(lib_static)
107     
108     
109     SET_TARGET_PROPERTIES (mfc_lib_udp_shared PROPERTIES CLEAN_DIRECT_OUTPUT 1)
110 endif(lib_mfc)
111 
112 
113 
114 
115 
116 
117 
118 # ---------------------------------------------------------------------------------------------------
119 #7.  an example , to show how to use dynamic libary
120 if (example_shared)
121     #7.1 set src path
122     set (exam_src 
123         ${CMAKE_CURRENT_SOURCE_DIR}/example/main.cpp
124     )
125 
126     if(WIN32)
127         #7.2 set library path
128         link_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/Debug)
129         link_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/Release) 
130     endif(WIN32)
131 
132     # 7.3 to get an executable program
133     add_executable(exam_lib_dynamic ${exam_src})
134 
135 
136     #7.4 to link library
137     target_link_libraries(exam_lib_dynamic lib_udp_shared)
138 endif(example_shared)
139 
140 
141 
142 
143 
144 #------------------------------------------------------------------------------------
145 
146 if(WIN32)
147     # 
148     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/build/Debug)
149     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/build/Release)
150 
151     # 
152     set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/buiold/lib/Debug)
153     set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/buiold/lib/Release)
154 endif(WIN32)

 


免責聲明!

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



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