欢迎指正
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)