├── README.md ├── cmake实践.pdf ├── p1-hello ├── CMakeLists.txt ├── hello └── main.c ├── p2-command ├── CMakeLists.txt ├── fun ├── fun.c ├── fun.h └── main.c ├── p3-helloworld ├── CMakeLists.txt ├── COPYRIGHT ├── README ├── build │ ├── bin │ │ └── hello │ └── src │ │ └── hello ├── runhello.sh └── src │ ├── CMakeLists.txt │ └── main.c ├── p4-library ├── CMakeLists.txt └── lib │ ├── CMakeLists.txt │ ├── hello.c │ └── hello.h ├── p5-use-library ├── CMakeLists.txt ├── build │ └── src │ │ └── main └── src │ ├── CMakeLists.txt │ └── main.c ├── p6-cmake-constant ├── CMakeLists.txt ├── anthor │ ├── CMakeLists.txt │ ├── src1.c │ ├── src2.c │ └── src3.c └── src │ └── CMakeLists.txt ├── p7-find-module ├── CMakeLists.txt ├── build │ ├── curl-test │ └── src │ │ └── curltest └── src │ ├── CMakeLists.txt │ └── main.c └── p8-find-my-module ├── CMakeLists.txt ├── build └── src │ └── hello ├── cmake └── FindHELLO.cmake └── src ├── CMakeLists.txt └── main.c /README.md: -------------------------------------------------------------------------------- 1 | # CMake 极简入门 2 | 3 | >本文根据《[cmake实践.pdf](./cmake实践.pdf)》整理并简化一些内容 4 | 5 | #### [项目地址](https://github.com/fishCoder/CMakePractice) 6 | 7 | ****** 8 | 9 | >p1 [最简单的hello world](./p1-hello) 10 | 11 | 12 | 文件结构(其他均为cmake生成的文件) 13 | 14 | CMakeLists.txt 15 | 16 | main.c 17 | 18 | ***main.c*** 19 | 20 | ``` 21 | #include 22 | int main(){ 23 | printf("Hello World use Cmake :)\n"); 24 | return 0; 25 | } 26 | ``` 27 | 28 | ***CMakeLists.txt*** 29 | 30 | ``` 31 | #设置项目名称 HELLO 32 | PROJECT (HELLO) 33 | 34 | #变量SRC_LIST 赋值 main.c 35 | SET(SRC_LIST main.c) 36 | 37 | #MESSAGE 输出log 38 | #SEND_ERROR,产生错误,生成过程被跳过 39 | #SATUS,输出前缀为—的信息 40 | #FATAL_ERROR,立即终止所有 cmake 过程 41 | #${}取出变量值 42 | MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) 43 | 44 | 45 | #隐式变量 HELLO_SOURCE_DIR 即 <项目名称>_SOURCE_DIR 46 | MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) 47 | 48 | #ADD_EXECUTABLE 生产执行文件 49 | ADD_EXECUTABLE(hello ${SRC_LIST}) 50 | ``` 51 | 52 | ***编译运行*** 53 | 54 | ``` 55 | cmake 56 | 57 | make 58 | 59 | ./hello 60 | ``` 61 | 62 | 63 | >p2 [多个文件的hello world](./p2-command) 64 | 65 | CMakeLists.txt 66 | 67 | main.c 68 | 69 | fun.h 70 | 71 | fun.c 72 | 73 | ****** 74 | 75 | ***fun.h*** 76 | 77 | ``` 78 | #include 79 | void fun(); 80 | ``` 81 | 82 | ***fun.c*** 83 | 84 | ``` 85 | void fun(){ 86 | printf("call fun \n"); 87 | } 88 | 89 | ``` 90 | 91 | ***main.c*** 92 | 93 | ``` 94 | #include 95 | #include "fun.h" 96 | 97 | int main(){ 98 | fun(); 99 | return 0; 100 | } 101 | 102 | ``` 103 | 104 | 105 | ***CMakeLists.txt*** 106 | 107 | ``` 108 | PROJECT(P2_COMMAND) 109 | 110 | #变量赋值 111 | SET(PARAM 'this is param') 112 | 113 | #赋多个值 给变量SRC 114 | SET(SRC main.c fun.h fun.c) 115 | 116 | MESSAGE(STATUS 'PARAM :' ${PARAM}) 117 | MESSAGE(STATUS 'SRC:' ${SRC}) 118 | 119 | #生成执行文件fun 120 | ADD_EXECUTABLE(fun ${SRC}) 121 | ``` 122 | ***编译运行*** 123 | 124 | ``` 125 | cmake 126 | 127 | make 128 | 129 | ./hello 130 | ``` 131 | 132 | 133 | 134 | >p3 [结构化的hello world](./p3-helloworld) 135 | 136 | CMakeLists.txt 137 | 138 | src\main.c CMakeLists.txt 139 | 140 | bin\ 141 | 142 | ****** 143 | 144 | ***CMakeLists.txt*** 145 | 146 | ``` 147 | PROJECT(HELLO) 148 | 149 | #添加子目录 并在该目录下自动寻找CMakeLists.txt 运行 150 | ADD_SUBDIRECTORY(src bin) 151 | 152 | #EXECUTABLE_OUTPUT_PATH 常量变量 输出可执行路径 153 | #PROJECT_BINARY_DIR 常量变量 154 | SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 155 | 156 | #LIBRARY_OUTPUT_PATH 动态库输出路径 157 | SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 158 | 159 | MESSAGE(STATUS EXECUTABLE_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH}) 160 | MESSAGE(STATUS LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}) 161 | 162 | 163 | ``` 164 | 165 | ***src\CMakeLists.txt*** 166 | 167 | ``` 168 | ADD_EXECUTABLE(hello main.c) 169 | 170 | ``` 171 | 172 | ***编译运行*** 173 | 174 | ``` 175 | cd build 176 | 177 | cmake .. 178 | 179 | make 180 | 181 | ./hello 182 | 183 | ``` 184 | 185 | 186 | >p4 [编译动态库 并且链接库](./p4-library) 187 | 188 | CMakeLists.txt 189 | 190 | bin/ 191 | 192 | lib/CMakeLists.txt hello.c hello.h 193 | 194 | ****** 195 | 196 | ***lib/hello.h*** 197 | 198 | ``` 199 | #ifndef HELLO_H 200 | #define HELLO_H 201 | 202 | #include 203 | void sayHello(); 204 | #endif 205 | 206 | 207 | ``` 208 | 209 | ***lib/hello.c*** 210 | 211 | ``` 212 | #include "hello.h" 213 | 214 | void sayHello(){ 215 | printf("Hello World :) \n"); 216 | } 217 | 218 | 219 | ``` 220 | 221 | 222 | ***CMakeLists.txt*** 223 | 224 | ``` 225 | PROJECT(HELLOLIB) 226 | 227 | ADD_SUBDIRECTORY(lib) 228 | ``` 229 | 230 | ***lib/CMakeLists.txt*** 231 | 232 | ``` 233 | SET(LIBHELLO_SRC hello.c) 234 | 235 | 236 | ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) 237 | #ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) 238 | ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) 239 | 240 | #静态库hello_static重命名输出hello 241 | SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") 242 | 243 | #OUTPUT_VALUE 赋值 hello_static. OUTPUT_NAME 244 | GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME) 245 | MESSAGE(STATUS "This is the hello_static OUTPUT_NAME:"${OUTPUT_VALUE}) 246 | 247 | #设置版本信息 248 | SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) 249 | 250 | #安装指令 251 | #INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) 252 | 253 | ``` 254 | 255 | ***编译运行*** 256 | 257 | ``` 258 | cd build 259 | cmake .. 260 | make 261 | ``` 262 | 263 | 264 | >p5 [链接外部库](./p5-use-library) 265 | 266 | CMakeLists.txt 267 | build/ 268 | src/CMakeLists.txt main.c 269 | 270 | ****** 271 | 272 | ***CMakeLists.txt*** 273 | 274 | ``` 275 | PROJECT(NEWHELLO) 276 | ADD_SUBDIRECTORY(src) 277 | ``` 278 | 279 | ***src/main.c*** 280 | 281 | ``` 282 | #include 283 | #include "hello.h" 284 | 285 | int main(){ 286 | sayHello(); 287 | return 0; 288 | } 289 | 290 | ``` 291 | 292 | ***src/CMakeLists.txt*** 293 | 294 | ``` 295 | #允许动态库路径使用相对路径 296 | #https://cmake.org/cmake/help/v3.0/policy/CMP0015.html 297 | cmake_policy(SET CMP0015 NEW) 298 | 299 | #添加头文件路径 300 | INCLUDE_DIRECTORIES(../../p4-library/lib) 301 | #添加动态库路径 302 | LINK_DIRECTORIES(../../p4-library/build/lib) 303 | 304 | ADD_EXECUTABLE(main main.c) 305 | 306 | #链接动态库 307 | TARGET_LINK_LIBRARIES(main hello) 308 | ``` 309 | 310 | 311 | >p6 [cmake一些基本常量以及语法](./p6-cmake-constant) 312 | 313 | CMakeLists.txt 314 | 315 | anthor\CMakeLists.txt src1.c src2.c src3.c 316 | 317 | src\CMakeLists.txt 318 | 319 | build\ 320 | 321 | ****** 322 | 323 | ***CMakeLists.txt*** 324 | 325 | ``` 326 | PROJECT(CONSTANT) 327 | MESSAGE(STATUS "CMAKE_BINARY_DIR=" ${CMAKE_BINARY_DIR}) 328 | MESSAGE(STATUS "PROJECT_BINARY_DIR=" ${PROJECT_BINARY_DIR}) 329 | MESSAGE(STATUS "CONSTANT_BINARY_DIR=" ${CONSTANT_BINARY_DIR}) 330 | 331 | #当前CMakeLists.txt路径 332 | MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR=" ${CMAKE_CURRENT_SOURCE_DIR}) 333 | MESSAGE(STATUS "CMAKE_CURRRENT_BINARY_DIR=" ${CMAKE_CURRRENT_BINARY_DIR}) 334 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_FILE=" ${CMAKE_CURRENT_LIST_FILE}) 335 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_LINE=" ${CMAKE_CURRENT_LIST_LINE}) 336 | MESSAGE(STATUS "CMAKE_MODULE_PATH=" ${CMAKE_MODULE_PATH}) 337 | 338 | ADD_SUBDIRECTORY(src) 339 | ADD_SUBDIRECTORY(anthor) 340 | ``` 341 | 342 | ***src/CMakeLists.txt*** 343 | 344 | ``` 345 | MESSAGE(STATUS "THIS IS SRC") 346 | 347 | MESSAGE(STATUS "CMAKE_BINARY_DIR=" ${CMAKE_BINARY_DIR}) 348 | MESSAGE(STATUS "PROJECT_BINARY_DIR=" ${PROJECT_BINARY_DIR}) 349 | MESSAGE(STATUS "CONSTANT_BINARY_DIR=" ${CONSTANT_BINARY_DIR}) 350 | 351 | 352 | MESSAGE(STATUS "CMAKE_SOURCE_DIR=" ${CMAKE_SOURCE_DIR}) 353 | MESSAGE(STATUS "PROJECT_SOURCE_DIR=" ${PROJECT_SOURCE_DIR}) 354 | MESSAGE(STATUS "CONSTANT_SOURCE_DIR=" ${CONSTANT_SOURCE_DIR}) 355 | 356 | MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR=" ${CMAKE_CURRENT_SOURCE_DIR}) 357 | MESSAGE(STATUS "CMAKE_CURRRENT_BINARY_DIR=" ${CMAKE_CURRRENT_BINARY_DIR}) 358 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_FILE=" ${CMAKE_CURRENT_LIST_FILE}) 359 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_LINE=" ${CMAKE_CURRENT_LIST_LINE}) 360 | 361 | ``` 362 | 363 | ***anthor/CMakeLists.txt*** 364 | 365 | ``` 366 | MESSAGE(STATUS "THIS IS ANTHOR") 367 | 368 | #检测当前编译平台 369 | #判断语句 370 | IF(WIN32) 371 | MESSAGE(STATUS "SYSTEM IS WIN32") 372 | ELSEIF(UNIX) 373 | MESSAGE(STATUS "SYSTEM IS UNIX") 374 | ELSEIF(APPLE) 375 | MESSAGE(STATUS "SYSTEM IS APPLE") 376 | ENDIF(WIN32) 377 | 378 | #将当前文件夹的文件 添加到变量SRC_LIST 379 | AUX_SOURCE_DIRECTORY(. SRC_LIST) 380 | 381 | #循环语句 382 | FOREACH(VAR ${SRC_LIST}) 383 | MESSAGE(${VAR}) 384 | ENDFOREACH(VAR) 385 | 386 | ``` 387 | 388 | 389 | 390 | 391 | 392 | >p7 [使用FIND_PACKAGE查找模块](./p7-find-module) 393 | 394 | CMakeLists.txt 395 | 396 | build/ 397 | 398 | src/CMakeLists.txt main.c 399 | 400 | ****** 401 | 402 | ***CMakeLists.txt*** 403 | 404 | ``` 405 | PROJECT(CURLTEST) 406 | ADD_SUBDIRECTORY(src) 407 | ``` 408 | 409 | ***src/main.c*** 410 | 411 | 调用外部curl库 获取网页 并保存下来 412 | 413 | ``` 414 | #include 415 | #include 416 | 417 | FILE *fp; 418 | int write_data(void *ptr, size_t size, size_t nmemb, void *stream){ 419 | int written = fwrite(ptr,size,nmemb,(FILE *)fp); 420 | return written; 421 | } 422 | 423 | int main(){ 424 | const char *path = "./curl-test"; 425 | const char *mode = "w"; 426 | fp = fopen(path,mode); 427 | curl_global_init(CURL_GLOBAL_ALL); 428 | CURLcode res; 429 | CURL *curl = curl_easy_init(); 430 | curl_easy_setopt(curl,CURLOPT_URL,"http://github.com/fishCoder"); 431 | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 432 | curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); 433 | res = curl_easy_perform(curl); 434 | curl_easy_cleanup(curl); 435 | return 0; 436 | } 437 | 438 | ``` 439 | 440 | ***src/CMakeLists.txt*** 441 | 442 | ``` 443 | ADD_EXECUTABLE(curltest main.c) 444 | 445 | #查找curl库 446 | FIND_PACKAGE(CURL) 447 | 448 | IF(CURL_FOUND) 449 | INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) 450 | TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY}) 451 | ELSE(CURL_FOUND) 452 | #没有找到了 手动设置头文件和库 453 | MESSAGE(STATUS ”CURL library not found”) 454 | INCLUDE_DIRECTORIES(/usr/include) 455 | TARGET_LINK_LIBRARIES(curltest curl) 456 | ENDIF(CURL_FOUND) 457 | 458 | ``` 459 | 460 | >p8 [自己编写一个查找模块](./p8-find-my-module) 461 | 462 | CMakeLists.txt 463 | 464 | build/ 465 | 466 | cmake/ 467 | 468 | src/ 469 | 470 | ****** 471 | 472 | ***CMakeLists.txt*** 473 | 474 | ``` 475 | cmake_minimum_required(VERSION 3.0) 476 | PROJECT(FINDHELLO) 477 | #添加外部库搜索路径 478 | SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) 479 | ADD_SUBDIRECTORY(src) 480 | ``` 481 | 482 | ***src/CMakeLists.txt*** 483 | 484 | ``` 485 | FIND_PACKAGE(HELLO) 486 | IF(HELLO_FOUND) 487 | ADD_EXECUTABLE(hello main.c) 488 | INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR}) 489 | TARGET_LINK_LIBRARIES(hello ${HELLO_LIBRARY}) 490 | ELSE(HELLO_FOUND) 491 | MESSAGE(FATAL_ERROR "hello library not found") 492 | ENDIF(HELLO_FOUND) 493 | 494 | ``` 495 | 496 | ***cmake/FindHELLO.cmake*** 497 | 498 | ``` 499 | cmake_policy(SET CMP0015 NEW) 500 | #添加头文件搜索路径 501 | FIND_PATH(HELLO_INCLUDE_DIR hello.h ../../p4-library/lib) 502 | #添加库搜索路径 503 | FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATHS ../../p4-library/build/lib) 504 | 505 | IF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) 506 | SET(HELLO_FOUND TRUE) 507 | ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) 508 | IF (HELLO_FOUND) 509 | IF (NOT HELLO_FIND_QUIETLY) 510 | MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}") 511 | ENDIF (NOT HELLO_FIND_QUIETLY) 512 | ELSE (HELLO_FOUND) 513 | IF (HELLO_FIND_REQUIRED) 514 | MESSAGE(FATAL_ERROR "Could not find hello library") 515 | ENDIF (HELLO_FIND_REQUIRED) 516 | ENDIF (HELLO_FOUND) 517 | 518 | ``` 519 | 520 | -------------------------------------------------------------------------------- /cmake实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/cmake实践.pdf -------------------------------------------------------------------------------- /p1-hello/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | #设置项目名称 HELLO 2 | PROJECT (HELLO) 3 | 4 | #变量SRC_LIST 赋值 main.c 5 | SET(SRC_LIST main.c) 6 | 7 | #MESSAGE 输出log 8 | #SEND_ERROR,产生错误,生成过程被跳过 9 | #SATUS,输出前缀为—的信息 10 | #FATAL_ERROR,立即终止所有 cmake 过程 11 | #${}取出变量值 12 | MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) 13 | 14 | 15 | #隐式变量 HELLO_SOURCE_DIR 即 <项目名称>_SOURCE_DIR 16 | MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) 17 | 18 | #ADD_EXECUTABLE 生产执行文件 19 | ADD_EXECUTABLE(hello ${SRC_LIST}) 20 | -------------------------------------------------------------------------------- /p1-hello/hello: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p1-hello/hello -------------------------------------------------------------------------------- /p1-hello/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main(){ 3 | printf("Hello World use Cmake :)\n"); 4 | return 0; 5 | } 6 | -------------------------------------------------------------------------------- /p2-command/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | PROJECT(P2_COMMAND) 2 | 3 | #变量赋值 4 | SET(PARAM 'this is param') 5 | 6 | #赋多个值 给变量SRC 7 | SET(SRC main.c fun.h fun.c) 8 | 9 | MESSAGE(STATUS 'PARAM :' ${PARAM}) 10 | MESSAGE(STATUS 'SRC:' ${SRC}) 11 | 12 | #生成执行文件fun 13 | ADD_EXECUTABLE(fun ${SRC}) 14 | -------------------------------------------------------------------------------- /p2-command/fun: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p2-command/fun -------------------------------------------------------------------------------- /p2-command/fun.c: -------------------------------------------------------------------------------- 1 | void fun(){ 2 | printf("call fun \n"); 3 | } 4 | -------------------------------------------------------------------------------- /p2-command/fun.h: -------------------------------------------------------------------------------- 1 | #include 2 | void fun(); 3 | -------------------------------------------------------------------------------- /p2-command/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "fun.h" 3 | 4 | int main(){ 5 | fun(); 6 | return 0; 7 | } 8 | -------------------------------------------------------------------------------- /p3-helloworld/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | PROJECT(HELLO) 2 | 3 | #添加子目录 并在该目录下自动寻找CMakeLists.txt 运行 4 | ADD_SUBDIRECTORY(src bin) 5 | 6 | #EXECUTABLE_OUTPUT_PATH 常量变量 输出可执行路径 7 | #PROJECT_BINARY_DIR 常量变量 8 | SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 9 | 10 | #LIBRARY_OUTPUT_PATH 动态库输出路径 11 | SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 12 | 13 | MESSAGE(STATUS EXECUTABLE_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH}) 14 | MESSAGE(STATUS LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}) 15 | -------------------------------------------------------------------------------- /p3-helloworld/COPYRIGHT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p3-helloworld/COPYRIGHT -------------------------------------------------------------------------------- /p3-helloworld/README: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p3-helloworld/README -------------------------------------------------------------------------------- /p3-helloworld/build/bin/hello: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p3-helloworld/build/bin/hello -------------------------------------------------------------------------------- /p3-helloworld/build/src/hello: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p3-helloworld/build/src/hello -------------------------------------------------------------------------------- /p3-helloworld/runhello.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p3-helloworld/runhello.sh -------------------------------------------------------------------------------- /p3-helloworld/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ADD_EXECUTABLE(hello main.c) 2 | -------------------------------------------------------------------------------- /p3-helloworld/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main(){ 3 | printf("Hello World use Cmake :)\n"); 4 | return 0; 5 | } 6 | -------------------------------------------------------------------------------- /p4-library/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | PROJECT(HELLOLIB) 2 | 3 | ADD_SUBDIRECTORY(lib) 4 | -------------------------------------------------------------------------------- /p4-library/lib/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | SET(LIBHELLO_SRC hello.c) 2 | 3 | 4 | ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) 5 | #ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) 6 | ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) 7 | 8 | #静态库hello_static重命名输出hello 9 | SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") 10 | 11 | #OUTPUT_VALUE 赋值 hello_static. OUTPUT_NAME 12 | GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME) 13 | MESSAGE(STATUS "This is the hello_static OUTPUT_NAME:"${OUTPUT_VALUE}) 14 | 15 | #设置版本信息 16 | SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) 17 | 18 | #安装指令 19 | #INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) -------------------------------------------------------------------------------- /p4-library/lib/hello.c: -------------------------------------------------------------------------------- 1 | #include "hello.h" 2 | 3 | void sayHello(){ 4 | printf("Hello World :) \n"); 5 | } 6 | -------------------------------------------------------------------------------- /p4-library/lib/hello.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef HELLO_H 3 | #define HELLO_H 4 | 5 | #include 6 | void sayHello(); 7 | #endif 8 | 9 | 10 | -------------------------------------------------------------------------------- /p5-use-library/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | PROJECT(NEWHELLO) 2 | ADD_SUBDIRECTORY(src) 3 | -------------------------------------------------------------------------------- /p5-use-library/build/src/main: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p5-use-library/build/src/main -------------------------------------------------------------------------------- /p5-use-library/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | #允许动态库路径使用相对路径 2 | #https://cmake.org/cmake/help/v3.0/policy/CMP0015.html 3 | cmake_policy(SET CMP0015 NEW) 4 | 5 | #添加头文件路径 6 | INCLUDE_DIRECTORIES(../../p4-library/lib) 7 | #添加动态库路径 8 | LINK_DIRECTORIES(../../p4-library/build/lib) 9 | 10 | ADD_EXECUTABLE(main main.c) 11 | 12 | #链接动态库 13 | TARGET_LINK_LIBRARIES(main hello) 14 | -------------------------------------------------------------------------------- /p5-use-library/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "hello.h" 3 | 4 | int main(){ 5 | sayHello(); 6 | return 0; 7 | } 8 | -------------------------------------------------------------------------------- /p6-cmake-constant/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | PROJECT(CONSTANT) 2 | MESSAGE(STATUS "CMAKE_BINARY_DIR=" ${CMAKE_BINARY_DIR}) 3 | MESSAGE(STATUS "PROJECT_BINARY_DIR=" ${PROJECT_BINARY_DIR}) 4 | MESSAGE(STATUS "CONSTANT_BINARY_DIR=" ${CONSTANT_BINARY_DIR}) 5 | 6 | #当前CMakeLists.txt路径 7 | MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR=" ${CMAKE_CURRENT_SOURCE_DIR}) 8 | MESSAGE(STATUS "CMAKE_CURRRENT_BINARY_DIR=" ${CMAKE_CURRRENT_BINARY_DIR}) 9 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_FILE=" ${CMAKE_CURRENT_LIST_FILE}) 10 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_LINE=" ${CMAKE_CURRENT_LIST_LINE}) 11 | MESSAGE(STATUS "CMAKE_MODULE_PATH=" ${CMAKE_MODULE_PATH}) 12 | 13 | ADD_SUBDIRECTORY(src) 14 | ADD_SUBDIRECTORY(anthor) -------------------------------------------------------------------------------- /p6-cmake-constant/anthor/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | MESSAGE(STATUS "THIS IS ANTHOR") 2 | 3 | #检测当前编译平台 4 | #判断语句 5 | IF(WIN32) 6 | MESSAGE(STATUS "SYSTEM IS WIN32") 7 | ELSEIF(UNIX) 8 | MESSAGE(STATUS "SYSTEM IS UNIX") 9 | ELSEIF(APPLE) 10 | MESSAGE(STATUS "SYSTEM IS APPLE") 11 | ENDIF(WIN32) 12 | 13 | #将当前文件夹的文件 添加到变量SRC_LIST 14 | AUX_SOURCE_DIRECTORY(. SRC_LIST) 15 | 16 | #循环语句 17 | FOREACH(VAR ${SRC_LIST}) 18 | MESSAGE(${VAR}) 19 | ENDFOREACH(VAR) -------------------------------------------------------------------------------- /p6-cmake-constant/anthor/src1.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p6-cmake-constant/anthor/src1.c -------------------------------------------------------------------------------- /p6-cmake-constant/anthor/src2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p6-cmake-constant/anthor/src2.c -------------------------------------------------------------------------------- /p6-cmake-constant/anthor/src3.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p6-cmake-constant/anthor/src3.c -------------------------------------------------------------------------------- /p6-cmake-constant/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | MESSAGE(STATUS "THIS IS SRC") 2 | 3 | MESSAGE(STATUS "CMAKE_BINARY_DIR=" ${CMAKE_BINARY_DIR}) 4 | MESSAGE(STATUS "PROJECT_BINARY_DIR=" ${PROJECT_BINARY_DIR}) 5 | MESSAGE(STATUS "CONSTANT_BINARY_DIR=" ${CONSTANT_BINARY_DIR}) 6 | 7 | 8 | MESSAGE(STATUS "CMAKE_SOURCE_DIR=" ${CMAKE_SOURCE_DIR}) 9 | MESSAGE(STATUS "PROJECT_SOURCE_DIR=" ${PROJECT_SOURCE_DIR}) 10 | MESSAGE(STATUS "CONSTANT_SOURCE_DIR=" ${CONSTANT_SOURCE_DIR}) 11 | 12 | MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR=" ${CMAKE_CURRENT_SOURCE_DIR}) 13 | MESSAGE(STATUS "CMAKE_CURRRENT_BINARY_DIR=" ${CMAKE_CURRRENT_BINARY_DIR}) 14 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_FILE=" ${CMAKE_CURRENT_LIST_FILE}) 15 | MESSAGE(STATUS "CMAKE_CURRENT_LIST_LINE=" ${CMAKE_CURRENT_LIST_LINE}) -------------------------------------------------------------------------------- /p7-find-module/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | PROJECT(CURLTEST) 2 | ADD_SUBDIRECTORY(src) 3 | 4 | 5 | -------------------------------------------------------------------------------- /p7-find-module/build/curl-test: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p7-find-module/build/curl-test -------------------------------------------------------------------------------- /p7-find-module/build/src/curltest: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p7-find-module/build/src/curltest -------------------------------------------------------------------------------- /p7-find-module/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ADD_EXECUTABLE(curltest main.c) 2 | 3 | FIND_PACKAGE(CURL) 4 | IF(CURL_FOUND) 5 | INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) 6 | TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY}) 7 | ELSE(CURL_FOUND) 8 | MESSAGE(STATUS ”CURL library not found”) 9 | INCLUDE_DIRECTORIES(/usr/include) 10 | TARGET_LINK_LIBRARIES(curltest curl) 11 | ENDIF(CURL_FOUND) 12 | 13 | 14 | -------------------------------------------------------------------------------- /p7-find-module/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | FILE *fp; 7 | int write_data(void *ptr, size_t size, size_t nmemb, void *stream){ 8 | int written = fwrite(ptr,size,nmemb,(FILE *)fp); 9 | return written; 10 | } 11 | 12 | int main(){ 13 | const char *path = "./curl-test"; 14 | const char *mode = "w"; 15 | fp = fopen(path,mode); 16 | curl_global_init(CURL_GLOBAL_ALL); 17 | CURLcode res; 18 | CURL *curl = curl_easy_init(); 19 | curl_easy_setopt(curl,CURLOPT_URL,"http://github.com/fishCoder"); 20 | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 21 | curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); 22 | res = curl_easy_perform(curl); 23 | curl_easy_cleanup(curl); 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /p8-find-my-module/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0) 2 | PROJECT(FINDHELLO) 3 | SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) 4 | ADD_SUBDIRECTORY(src) 5 | -------------------------------------------------------------------------------- /p8-find-my-module/build/src/hello: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fishCoder/CMakePractice/ed7b435c1e1140c31df5dc414214ac21c3d7ff28/p8-find-my-module/build/src/hello -------------------------------------------------------------------------------- /p8-find-my-module/cmake/FindHELLO.cmake: -------------------------------------------------------------------------------- 1 | cmake_policy(SET CMP0015 NEW) 2 | 3 | FIND_PATH(HELLO_INCLUDE_DIR hello.h ../../p4-library/lib) 4 | FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATHS ../../p4-library/build/lib) 5 | 6 | IF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) 7 | SET(HELLO_FOUND TRUE) 8 | ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) 9 | IF (HELLO_FOUND) 10 | IF (NOT HELLO_FIND_QUIETLY) 11 | MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}") 12 | ENDIF (NOT HELLO_FIND_QUIETLY) 13 | ELSE (HELLO_FOUND) 14 | IF (HELLO_FIND_REQUIRED) 15 | MESSAGE(FATAL_ERROR "Could not find hello library") 16 | ENDIF (HELLO_FIND_REQUIRED) 17 | ENDIF (HELLO_FOUND) 18 | -------------------------------------------------------------------------------- /p8-find-my-module/src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | FIND_PACKAGE(HELLO) 2 | IF(HELLO_FOUND) 3 | ADD_EXECUTABLE(hello main.c) 4 | INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR}) 5 | TARGET_LINK_LIBRARIES(hello ${HELLO_LIBRARY}) 6 | ELSE(HELLO_FOUND) 7 | MESSAGE(FATAL_ERROR "hello library not found") 8 | ENDIF(HELLO_FOUND) 9 | -------------------------------------------------------------------------------- /p8-find-my-module/src/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | sayHello(); 5 | return 0; 6 | } 7 | --------------------------------------------------------------------------------