[{"data":1,"prerenderedAt":3127},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":2566,"wiki:author-members":3115},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":56,"chapterOrder":2554,"date":2555,"description":14,"docKey":2556,"docRoot":2557,"docTitle":2558,"extension":2559,"isWikiDoc":77,"isWikiIndex":2560,"meta":2561,"navigation":77,"path":2562,"seo":2563,"stem":2564,"wikiDepth":56,"__hash__":2565},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项.md","顶层CMake与公共编译选项",[7],"董佳辉",{"type":9,"value":10,"toc":2526},"minimark",[11,15,31,34,40,43,140,145,149,164,167,178,181,229,232,325,332,343,347,362,364,378,382,394,397,435,442,469,472,480,483,499,502,508,513,525,528,530,555,558,618,621,627,636,639,642,702,705,721,736,742,753,756,759,853,856,876,888,891,917,920,962,965,992,998,1013,1016,1021,1026,1029,1057,1060,1100,1106,1109,1115,1118,1127,1130,1136,1142,1153,1162,1164,1193,1196,1208,1211,1223,1226,1229,1239,1245,1250,1253,1421,1424,1430,1441,1444,1446,1509,1512,1522,1525,1548,1551,1564,1570,1585,1588,1590,1620,1626,1632,1647,1650,1652,1695,1701,1705,1736,1739,1742,1791,1798,1812,1815,1821,1836,1842,1845,1875,1881,1899,1906,1912,1927,1930,1942,1947,2045,2048,2057,2060,2064,2079,2082,2084,2145,2148,2158,2161,2175,2178,2184,2199,2202,2205,2232,2236,2265,2268,2271,2315,2318,2360,2366,2379,2382,2401,2404,2454,2457,2491,2494,2522],[12,13,14],"p",{},"本节讲两个文件：",[16,17,18,26],"ol",{},[19,20,21,22],"li",{},"顶层 ",[23,24,25],"code",{},"CMakeLists.txt",[19,27,28],{},[23,29,30],{},"cmake\u002FProjectOptions.cmake",[12,32,33],{},"这两个文件决定了整个工程的基本身份和公共编译规则。",[35,36,21,38],"h2",{"id":37},"顶层-cmakeliststxt",[23,39,25],{},[12,41,42],{},"本模板的顶层文件如下：",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-cmake shiki shiki-themes github-light github-dark","cmake_minimum_required(VERSION 3.22)\n\nproject(cmake_template VERSION 1.0.0 LANGUAGES C CXX)\n\ninclude(GNUInstallDirs)\n\ninclude(\"${CMAKE_CURRENT_LIST_DIR}\u002Fcmake\u002FProjectOptions.cmake\")\n\nadd_subdirectory(src)\n","cmake","",[23,51,52,72,79,93,98,107,112,126,131],{"__ignoreMap":49},[53,54,57,61,65,69],"span",{"class":55,"line":56},"line",1,[53,58,60],{"class":59},"szBVR","cmake_minimum_required",[53,62,64],{"class":63},"sVt8B","(",[53,66,68],{"class":67},"sScJk","VERSION",[53,70,71],{"class":63}," 3.22)\n",[53,73,75],{"class":55,"line":74},2,[53,76,78],{"emptyLinePlaceholder":77},true,"\n",[53,80,82,85,88,90],{"class":55,"line":81},3,[53,83,84],{"class":59},"project",[53,86,87],{"class":63},"(cmake_template ",[53,89,68],{"class":67},[53,91,92],{"class":63}," 1.0.0 LANGUAGES C CXX)\n",[53,94,96],{"class":55,"line":95},4,[53,97,78],{"emptyLinePlaceholder":77},[53,99,101,104],{"class":55,"line":100},5,[53,102,103],{"class":59},"include",[53,105,106],{"class":63},"(GNUInstallDirs)\n",[53,108,110],{"class":55,"line":109},6,[53,111,78],{"emptyLinePlaceholder":77},[53,113,115,117,119,123],{"class":55,"line":114},7,[53,116,103],{"class":59},[53,118,64],{"class":63},[53,120,122],{"class":121},"sZZnC","\"${CMAKE_CURRENT_LIST_DIR}\u002Fcmake\u002FProjectOptions.cmake\"",[53,124,125],{"class":63},")\n",[53,127,129],{"class":55,"line":128},8,[53,130,78],{"emptyLinePlaceholder":77},[53,132,134,137],{"class":55,"line":133},9,[53,135,136],{"class":59},"add_subdirectory",[53,138,139],{"class":63},"(src)\n",[12,141,21,142,144],{},[23,143,25],{}," 的原则是：只做总控，不堆具体业务和第三方依赖。",[35,146,147],{"id":60},[23,148,60],{},[44,150,152],{"className":46,"code":151,"language":48,"meta":49,"style":49},"cmake_minimum_required(VERSION 3.22)\n",[23,153,154],{"__ignoreMap":49},[53,155,156,158,160,162],{"class":55,"line":56},[53,157,60],{"class":59},[53,159,64],{"class":63},[53,161,68],{"class":67},[53,163,71],{"class":63},[12,165,166],{},"作用：",[16,168,169,172,175],{},[19,170,171],{},"指定项目需要的最低 CMake 版本。",[19,173,174],{},"告诉 CMake 使用对应版本的策略行为。",[19,176,177],{},"太老的 CMake 会直接报错，不会继续配置。",[12,179,180],{},"可以填什么：",[44,182,184],{"className":46,"code":183,"language":48,"meta":49,"style":49},"cmake_minimum_required(VERSION 3.20)\ncmake_minimum_required(VERSION 3.22)\ncmake_minimum_required(VERSION 3.25)\ncmake_minimum_required(VERSION 3.28)\n",[23,185,186,197,207,218],{"__ignoreMap":49},[53,187,188,190,192,194],{"class":55,"line":56},[53,189,60],{"class":59},[53,191,64],{"class":63},[53,193,68],{"class":67},[53,195,196],{"class":63}," 3.20)\n",[53,198,199,201,203,205],{"class":55,"line":74},[53,200,60],{"class":59},[53,202,64],{"class":63},[53,204,68],{"class":67},[53,206,71],{"class":63},[53,208,209,211,213,215],{"class":55,"line":81},[53,210,60],{"class":59},[53,212,64],{"class":63},[53,214,68],{"class":67},[53,216,217],{"class":63}," 3.25)\n",[53,219,220,222,224,226],{"class":55,"line":95},[53,221,60],{"class":59},[53,223,64],{"class":63},[53,225,68],{"class":67},[53,227,228],{"class":63}," 3.28)\n",[12,230,231],{},"选择建议：",[233,234,235,249],"table",{},[236,237,238],"thead",{},[239,240,241,246],"tr",{},[242,243,245],"th",{"align":244},"left","写法",[242,247,248],{"align":244},"说明",[250,251,252,263,273,283,293,310],"tbody",{},[239,253,254,260],{},[255,256,257],"td",{"align":244},[23,258,259],{},"3.10",[255,261,262],{"align":244},"太老，很多现代 CMake 写法不方便",[239,264,265,270],{},[255,266,267],{"align":244},[23,268,269],{},"3.16",[255,271,272],{"align":244},"Ubuntu 20.04 常见版本，兼容性好",[239,274,275,280],{},[255,276,277],{"align":244},[23,278,279],{},"3.22",[255,281,282],{"align":244},"本模板使用，兼容 Ubuntu 22.04 的 CMake 3.22.1，搭配预设格式版本 3",[239,284,285,290],{},[255,286,287],{"align":244},[23,288,289],{},"3.25",[255,291,292],{"align":244},"使用预设格式版本 6 时需要，本模板当前没有使用其新增功能",[239,294,295,300],{},[255,296,297],{"align":244},[23,298,299],{},"3.28",[255,301,302,303],{"align":244},"Ubuntu 24.04 常见版本，系统软件源提供 ",[304,305,309],"a",{"href":306,"rel":307},"https:\u002F\u002Fpackages.ubuntu.com\u002Fnoble\u002Fcmake",[308],"nofollow","CMake 3.28.3",[239,311,312,317],{},[255,313,314],{"align":244},[23,315,316],{},"4.2",[255,318,319,320],{"align":244},"Ubuntu 26.04 常见版本，系统软件源提供 ",[304,321,324],{"href":322,"rel":323},"https:\u002F\u002Fpackages.ubuntu.com\u002Fresolute\u002Famd64\u002Fcmake",[308],"CMake 4.2.3",[12,326,327,328,331],{},"在 Ubuntu 24.04、26.04 上使用较新的 CMake 时，工程仍可保留 ",[23,329,330],{},"VERSION 3.22"," 的最低要求。只有实际使用了更高版本才支持的功能时，才需要提高最低版本。",[12,333,334,335,338,339,342],{},"最低版本应根据实际使用的功能和验证环境确定。本模板在 CMake 3.22.1 下已验证配置、构建、安装与运行，无需提高到 3.25。调整完整工程的最低要求时，还应同步检查 ",[23,336,337],{},"CMakePresets.json"," 的格式版本和 ",[23,340,341],{},"cmakeMinimumRequired","。",[35,344,345],{"id":84},[23,346,84],{},[44,348,350],{"className":46,"code":349,"language":48,"meta":49,"style":49},"project(cmake_template VERSION 1.0.0 LANGUAGES C CXX)\n",[23,351,352],{"__ignoreMap":49},[53,353,354,356,358,360],{"class":55,"line":56},[53,355,84],{"class":59},[53,357,87],{"class":63},[53,359,68],{"class":67},[53,361,92],{"class":63},[12,363,166],{},[16,365,366,369,372,375],{},[19,367,368],{},"设置项目名。",[19,370,371],{},"设置项目版本。",[19,373,374],{},"声明项目使用哪些语言。",[19,376,377],{},"初始化一批 CMake 变量。",[379,380,381],"h3",{"id":381},"项目名",[44,383,385],{"className":46,"code":384,"language":48,"meta":49,"style":49},"project(cmake_template)\n",[23,386,387],{"__ignoreMap":49},[53,388,389,391],{"class":55,"line":56},[53,390,84],{"class":59},[53,392,393],{"class":63},"(cmake_template)\n",[12,395,396],{},"项目名会影响这些变量：",[233,398,399,409],{},[236,400,401],{},[239,402,403,406],{},[242,404,405],{"align":244},"变量",[242,407,408],{"align":244},"值",[250,410,411,423],{},[239,412,413,418],{},[255,414,415],{"align":244},[23,416,417],{},"PROJECT_NAME",[255,419,420],{"align":244},[23,421,422],{},"cmake_template",[239,424,425,430],{},[255,426,427],{"align":244},[23,428,429],{},"CMAKE_PROJECT_NAME",[255,431,432,433],{"align":244},"顶层项目名，通常也是 ",[23,434,422],{},[12,436,437,438,441],{},"本模板在 ",[23,439,440],{},"src\u002FCMakeLists.txt"," 中使用：",[44,443,445],{"className":46,"code":444,"language":48,"meta":49,"style":49},"add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp\n)\n",[23,446,447,457,465],{"__ignoreMap":49},[53,448,449,452,454],{"class":55,"line":56},[53,450,451],{"class":59},"add_executable",[53,453,64],{"class":63},[53,455,456],{"class":59},"${PROJECT_NAME}\n",[53,458,459,462],{"class":55,"line":74},[53,460,461],{"class":59},"  ${CMAKE_CURRENT_SOURCE_DIR}",[53,463,464],{"class":63},"\u002Fmain.cpp\n",[53,466,467],{"class":55,"line":81},[53,468,125],{"class":63},[12,470,471],{},"所以最终可执行文件名就是：",[44,473,478],{"className":474,"code":476,"language":477,"meta":49},[475],"language-text","cmake_template\n","text",[23,479,476],{"__ignoreMap":49},[12,481,482],{},"如果把项目名改成：",[44,484,486],{"className":46,"code":485,"language":48,"meta":49,"style":49},"project(robot_app VERSION 1.0.0 LANGUAGES C CXX)\n",[23,487,488],{"__ignoreMap":49},[53,489,490,492,495,497],{"class":55,"line":56},[53,491,84],{"class":59},[53,493,494],{"class":63},"(robot_app ",[53,496,68],{"class":67},[53,498,92],{"class":63},[12,500,501],{},"最终可执行文件就会变成：",[44,503,506],{"className":504,"code":505,"language":477,"meta":49},[475],"robot_app\n",[23,507,505],{"__ignoreMap":49},[379,509,511],{"id":510},"version",[23,512,68],{},[44,514,516],{"className":46,"code":515,"language":48,"meta":49,"style":49},"VERSION 1.0.0\n",[23,517,518],{"__ignoreMap":49},[53,519,520,522],{"class":55,"line":56},[53,521,68],{"class":67},[53,523,524],{"class":63}," 1.0.0\n",[12,526,527],{},"项目版本号。",[12,529,180],{},[44,531,533],{"className":46,"code":532,"language":48,"meta":49,"style":49},"VERSION 0.1.0\nVERSION 1.0.0\nVERSION 2.3.4\n",[23,534,535,542,548],{"__ignoreMap":49},[53,536,537,539],{"class":55,"line":56},[53,538,68],{"class":67},[53,540,541],{"class":63}," 0.1.0\n",[53,543,544,546],{"class":55,"line":74},[53,545,68],{"class":67},[53,547,524],{"class":63},[53,549,550,552],{"class":55,"line":81},[53,551,68],{"class":67},[53,553,554],{"class":63}," 2.3.4\n",[12,556,557],{},"CMake 会生成这些变量：",[233,559,560,569],{},[236,561,562],{},[239,563,564,566],{},[242,565,405],{"align":244},[242,567,568],{"align":244},"示例值",[250,570,571,583,595,607],{},[239,572,573,578],{},[255,574,575],{"align":244},[23,576,577],{},"PROJECT_VERSION",[255,579,580],{"align":244},[23,581,582],{},"1.0.0",[239,584,585,590],{},[255,586,587],{"align":244},[23,588,589],{},"PROJECT_VERSION_MAJOR",[255,591,592],{"align":244},[23,593,594],{},"1",[239,596,597,602],{},[255,598,599],{"align":244},[23,600,601],{},"PROJECT_VERSION_MINOR",[255,603,604],{"align":244},[23,605,606],{},"0",[239,608,609,614],{},[255,610,611],{"align":244},[23,612,613],{},"PROJECT_VERSION_PATCH",[255,615,616],{"align":244},[23,617,606],{},[12,619,620],{},"以后如果做安装包、导出 CMake package、生成版本头文件，这些变量会很有用。",[379,622,624],{"id":623},"languages",[23,625,626],{},"LANGUAGES",[44,628,630],{"className":46,"code":629,"language":48,"meta":49,"style":49},"LANGUAGES C CXX\n",[23,631,632],{"__ignoreMap":49},[53,633,634],{"class":55,"line":56},[53,635,629],{"class":63},[12,637,638],{},"声明项目启用哪些语言。",[12,640,641],{},"常见值：",[233,643,644,652],{},[236,645,646],{},[239,647,648,650],{},[242,649,408],{"align":244},[242,651,248],{"align":244},[250,653,654,664,674,683,693],{},[239,655,656,661],{},[255,657,658],{"align":244},[23,659,660],{},"C",[255,662,663],{"align":244},"C 语言",[239,665,666,671],{},[255,667,668],{"align":244},[23,669,670],{},"CXX",[255,672,673],{"align":244},"C++",[239,675,676,681],{},[255,677,678],{"align":244},[23,679,680],{},"CUDA",[255,682,680],{"align":244},[239,684,685,690],{},[255,686,687],{"align":244},[23,688,689],{},"ASM",[255,691,692],{"align":244},"汇编",[239,694,695,700],{},[255,696,697],{"align":244},[23,698,699],{},"Fortran",[255,701,699],{"align":244},[12,703,704],{},"如果项目只有 C++，也可以写：",[44,706,708],{"className":46,"code":707,"language":48,"meta":49,"style":49},"project(cmake_template VERSION 1.0.0 LANGUAGES CXX)\n",[23,709,710],{"__ignoreMap":49},[53,711,712,714,716,718],{"class":55,"line":56},[53,713,84],{"class":59},[53,715,87],{"class":63},[53,717,68],{"class":67},[53,719,720],{"class":63}," 1.0.0 LANGUAGES CXX)\n",[12,722,723,724,727,728,731,732,735],{},"本模板保留 ",[23,725,726],{},"C CXX","，是为了允许 ",[23,729,730],{},"src\u002F*.c"," 和 ",[23,733,734],{},"src\u002F*.cpp"," 都能参与构建。",[35,737,739],{"id":738},"includegnuinstalldirs",[23,740,741],{},"include(GNUInstallDirs)",[44,743,745],{"className":46,"code":744,"language":48,"meta":49,"style":49},"include(GNUInstallDirs)\n",[23,746,747],{"__ignoreMap":49},[53,748,749,751],{"class":55,"line":56},[53,750,103],{"class":59},[53,752,106],{"class":63},[12,754,755],{},"作用：加载 GNU 风格的安装目录变量。",[12,757,758],{},"常用变量：",[233,760,761,773],{},[236,762,763],{},[239,764,765,767,770],{},[242,766,405],{"align":244},[242,768,769],{"align":244},"常见值",[242,771,772],{"align":244},"用途",[250,774,775,790,809,823,838],{},[239,776,777,782,787],{},[255,778,779],{"align":244},[23,780,781],{},"CMAKE_INSTALL_BINDIR",[255,783,784],{"align":244},[23,785,786],{},"bin",[255,788,789],{"align":244},"可执行文件",[239,791,792,797,806],{},[255,793,794],{"align":244},[23,795,796],{},"CMAKE_INSTALL_LIBDIR",[255,798,799,802,803],{"align":244},[23,800,801],{},"lib"," 或 ",[23,804,805],{},"lib64",[255,807,808],{"align":244},"动态库、静态库",[239,810,811,816,820],{},[255,812,813],{"align":244},[23,814,815],{},"CMAKE_INSTALL_INCLUDEDIR",[255,817,818],{"align":244},[23,819,103],{},[255,821,822],{"align":244},"头文件",[239,824,825,830,835],{},[255,826,827],{"align":244},[23,828,829],{},"CMAKE_INSTALL_DATADIR",[255,831,832],{"align":244},[23,833,834],{},"share",[255,836,837],{"align":244},"数据文件",[239,839,840,845,850],{},[255,841,842],{"align":244},[23,843,844],{},"CMAKE_INSTALL_DOCDIR",[255,846,847],{"align":244},[23,848,849],{},"share\u002Fdoc\u002F项目名",[255,851,852],{"align":244},"文档",[12,854,855],{},"为什么不用手写：",[44,857,859],{"className":46,"code":858,"language":48,"meta":49,"style":49},"install(TARGETS app DESTINATION bin)\ninstall(TARGETS lib DESTINATION lib)\n",[23,860,861,869],{"__ignoreMap":49},[53,862,863,866],{"class":55,"line":56},[53,864,865],{"class":59},"install",[53,867,868],{"class":63},"(TARGETS app DESTINATION bin)\n",[53,870,871,873],{"class":55,"line":74},[53,872,865],{"class":59},[53,874,875],{"class":63},"(TARGETS lib DESTINATION lib)\n",[12,877,878,879,802,881,883,884,887],{},"因为不同 Linux 发行版可能使用 ",[23,880,801],{},[23,882,805],{},"。用 ",[23,885,886],{},"GNUInstallDirs"," 后，CMake 会根据系统习惯设置。",[12,889,890],{},"模板中的使用示例：",[44,892,894],{"className":46,"code":893,"language":48,"meta":49,"style":49},"install(TARGETS ${PROJECT_NAME}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n",[23,895,896,905,913],{"__ignoreMap":49},[53,897,898,900,903],{"class":55,"line":56},[53,899,865],{"class":59},[53,901,902],{"class":63},"(TARGETS ",[53,904,456],{"class":59},[53,906,907,910],{"class":55,"line":74},[53,908,909],{"class":63},"  RUNTIME DESTINATION ",[53,911,912],{"class":59},"${CMAKE_INSTALL_BINDIR}\n",[53,914,915],{"class":55,"line":81},[53,916,125],{"class":63},[12,918,919],{},"库安装：",[44,921,923],{"className":46,"code":922,"language":48,"meta":49,"style":49},"install(TARGETS ${PREFIX}_src_lib\n  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n",[23,924,925,937,945,952,958],{"__ignoreMap":49},[53,926,927,929,931,934],{"class":55,"line":56},[53,928,865],{"class":59},[53,930,902],{"class":63},[53,932,933],{"class":59},"${PREFIX}",[53,935,936],{"class":63},"_src_lib\n",[53,938,939,942],{"class":55,"line":74},[53,940,941],{"class":63},"  LIBRARY DESTINATION ",[53,943,944],{"class":59},"${CMAKE_INSTALL_LIBDIR}\n",[53,946,947,950],{"class":55,"line":81},[53,948,949],{"class":63},"  ARCHIVE DESTINATION ",[53,951,944],{"class":59},[53,953,954,956],{"class":55,"line":95},[53,955,909],{"class":63},[53,957,912],{"class":59},[53,959,960],{"class":55,"line":100},[53,961,125],{"class":63},[12,963,964],{},"头文件安装：",[44,966,968],{"className":46,"code":967,"language":48,"meta":49,"style":49},"install(DIRECTORY \"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n)\n",[23,969,970,980,988],{"__ignoreMap":49},[53,971,972,974,977],{"class":55,"line":56},[53,973,865],{"class":59},[53,975,976],{"class":63},"(DIRECTORY ",[53,978,979],{"class":121},"\"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n",[53,981,982,985],{"class":55,"line":74},[53,983,984],{"class":63},"  DESTINATION ",[53,986,987],{"class":59},"${CMAKE_INSTALL_INCLUDEDIR}\n",[53,989,990],{"class":55,"line":81},[53,991,125],{"class":63},[35,993,995],{"id":994},"includecmake_current_list_dircmakeprojectoptionscmake",[23,996,997],{},"include(\"${CMAKE_CURRENT_LIST_DIR}\u002Fcmake\u002FProjectOptions.cmake\")",[44,999,1001],{"className":46,"code":1000,"language":48,"meta":49,"style":49},"include(\"${CMAKE_CURRENT_LIST_DIR}\u002Fcmake\u002FProjectOptions.cmake\")\n",[23,1002,1003],{"__ignoreMap":49},[53,1004,1005,1007,1009,1011],{"class":55,"line":56},[53,1006,103],{"class":59},[53,1008,64],{"class":63},[53,1010,122],{"class":121},[53,1012,125],{"class":63},[12,1014,1015],{},"作用：读取另一个 CMake 文件。",[379,1017,1018],{"id":103},[23,1019,1020],{},"include(...)",[12,1022,1023,1025],{},[23,1024,103],{}," 会在当前作用域执行指定的 CMake 脚本。",[12,1027,1028],{},"可以写：",[44,1030,1032],{"className":46,"code":1031,"language":48,"meta":49,"style":49},"include(GNUInstallDirs)\ninclude(cmake\u002FProjectOptions.cmake)\ninclude(\"${CMAKE_CURRENT_LIST_DIR}\u002Fcmake\u002FProjectOptions.cmake\")\n",[23,1033,1034,1040,1047],{"__ignoreMap":49},[53,1035,1036,1038],{"class":55,"line":56},[53,1037,103],{"class":59},[53,1039,106],{"class":63},[53,1041,1042,1044],{"class":55,"line":74},[53,1043,103],{"class":59},[53,1045,1046],{"class":63},"(cmake\u002FProjectOptions.cmake)\n",[53,1048,1049,1051,1053,1055],{"class":55,"line":81},[53,1050,103],{"class":59},[53,1052,64],{"class":63},[53,1054,122],{"class":121},[53,1056,125],{"class":63},[12,1058,1059],{},"区别：",[233,1061,1062,1070],{},[236,1063,1064],{},[239,1065,1066,1068],{},[242,1067,245],{"align":244},[242,1069,248],{"align":244},[250,1071,1072,1081,1091],{},[239,1073,1074,1078],{},[255,1075,1076],{"align":244},[23,1077,741],{},[255,1079,1080],{"align":244},"加载 CMake 内置模块",[239,1082,1083,1088],{},[255,1084,1085],{"align":244},[23,1086,1087],{},"include(cmake\u002FProjectOptions.cmake)",[255,1089,1090],{"align":244},"相对路径写法",[239,1092,1093,1097],{},[255,1094,1095],{"align":244},[23,1096,997],{},[255,1098,1099],{"align":244},"更稳，不受当前工作目录影响",[379,1101,1103],{"id":1102},"cmake_current_list_dir",[23,1104,1105],{},"CMAKE_CURRENT_LIST_DIR",[12,1107,1108],{},"表示当前正在处理的 CMake 文件所在目录。",[12,1110,1111,1112,1114],{},"在顶层 ",[23,1113,25],{}," 中，它就是项目根目录。",[12,1116,1117],{},"所以：",[44,1119,1121],{"className":46,"code":1120,"language":48,"meta":49,"style":49},"\"${CMAKE_CURRENT_LIST_DIR}\u002Fcmake\u002FProjectOptions.cmake\"\n",[23,1122,1123],{"__ignoreMap":49},[53,1124,1125],{"class":55,"line":56},[53,1126,1120],{"class":121},[12,1128,1129],{},"表示：",[44,1131,1134],{"className":1132,"code":1133,"language":477,"meta":49},[475],"项目根目录\u002Fcmake\u002FProjectOptions.cmake\n",[23,1135,1133],{"__ignoreMap":49},[35,1137,1139],{"id":1138},"add_subdirectorysrc",[23,1140,1141],{},"add_subdirectory(src)",[44,1143,1145],{"className":46,"code":1144,"language":48,"meta":49,"style":49},"add_subdirectory(src)\n",[23,1146,1147],{"__ignoreMap":49},[53,1148,1149,1151],{"class":55,"line":56},[53,1150,136],{"class":59},[53,1152,139],{"class":63},[12,1154,1155,1156,1159,1160,342],{},"作用：进入 ",[23,1157,1158],{},"src"," 子目录，继续读取 ",[23,1161,440],{},[12,1163,180],{},[44,1165,1167],{"className":46,"code":1166,"language":48,"meta":49,"style":49},"add_subdirectory(src)\nadd_subdirectory(test)\nadd_subdirectory(third_party\u002Fsome_lib)\n",[23,1168,1169,1175,1186],{"__ignoreMap":49},[53,1170,1171,1173],{"class":55,"line":56},[53,1172,136],{"class":59},[53,1174,139],{"class":63},[53,1176,1177,1179,1181,1184],{"class":55,"line":74},[53,1178,136],{"class":59},[53,1180,64],{"class":63},[53,1182,1183],{"class":59},"test",[53,1185,125],{"class":63},[53,1187,1188,1190],{"class":55,"line":81},[53,1189,136],{"class":59},[53,1191,1192],{"class":63},"(third_party\u002Fsome_lib)\n",[12,1194,1195],{},"常见写法：",[44,1197,1199],{"className":46,"code":1198,"language":48,"meta":49,"style":49},"add_subdirectory(\u003C源码目录>)\n",[23,1200,1201],{"__ignoreMap":49},[53,1202,1203,1205],{"class":55,"line":56},[53,1204,136],{"class":59},[53,1206,1207],{"class":63},"(\u003C源码目录>)\n",[12,1209,1210],{},"也可以指定构建目录：",[44,1212,1214],{"className":46,"code":1213,"language":48,"meta":49,"style":49},"add_subdirectory(src src_build)\n",[23,1215,1216],{"__ignoreMap":49},[53,1217,1218,1220],{"class":55,"line":56},[53,1219,136],{"class":59},[53,1221,1222],{"class":63},"(src src_build)\n",[12,1224,1225],{},"但一般不需要。",[12,1227,1228],{},"顶层只写：",[44,1230,1231],{"className":46,"code":1144,"language":48,"meta":49,"style":49},[23,1232,1233],{"__ignoreMap":49},[53,1234,1235,1237],{"class":55,"line":56},[53,1236,136],{"class":59},[53,1238,139],{"class":63},[12,1240,1241,1242,1244],{},"表示具体的可执行文件、库、依赖，都交给 ",[23,1243,1158],{}," 下面的 CMake 文件管理。",[35,1246,1248],{"id":1247},"cmakeprojectoptionscmake",[23,1249,30],{},[12,1251,1252],{},"本模板内容如下：",[44,1254,1256],{"className":46,"code":1255,"language":48,"meta":49,"style":49},"set(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_CXX_EXTENSIONS OFF)\n\nset(CMAKE_C_STANDARD 11)\nset(CMAKE_C_STANDARD_REQUIRED ON)\nset(CMAKE_C_EXTENSIONS OFF)\n\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n\nadd_library(project_options INTERFACE)\ntarget_compile_features(project_options INTERFACE cxx_std_20)\n\nadd_library(project_warnings INTERFACE)\ntarget_compile_options(project_warnings INTERFACE\n  -Wall\n  -Wextra\n  -Wpedantic\n)\n",[23,1257,1258,1266,1278,1290,1294,1301,1312,1323,1327,1338,1343,1357,1370,1375,1387,1398,1404,1410,1416],{"__ignoreMap":49},[53,1259,1260,1263],{"class":55,"line":56},[53,1261,1262],{"class":59},"set",[53,1264,1265],{"class":63},"(CMAKE_CXX_STANDARD 20)\n",[53,1267,1268,1270,1273,1276],{"class":55,"line":74},[53,1269,1262],{"class":59},[53,1271,1272],{"class":63},"(CMAKE_CXX_STANDARD_REQUIRED ",[53,1274,1275],{"class":59},"ON",[53,1277,125],{"class":63},[53,1279,1280,1282,1285,1288],{"class":55,"line":81},[53,1281,1262],{"class":59},[53,1283,1284],{"class":63},"(CMAKE_CXX_EXTENSIONS ",[53,1286,1287],{"class":59},"OFF",[53,1289,125],{"class":63},[53,1291,1292],{"class":55,"line":95},[53,1293,78],{"emptyLinePlaceholder":77},[53,1295,1296,1298],{"class":55,"line":100},[53,1297,1262],{"class":59},[53,1299,1300],{"class":63},"(CMAKE_C_STANDARD 11)\n",[53,1302,1303,1305,1308,1310],{"class":55,"line":109},[53,1304,1262],{"class":59},[53,1306,1307],{"class":63},"(CMAKE_C_STANDARD_REQUIRED ",[53,1309,1275],{"class":59},[53,1311,125],{"class":63},[53,1313,1314,1316,1319,1321],{"class":55,"line":114},[53,1315,1262],{"class":59},[53,1317,1318],{"class":63},"(CMAKE_C_EXTENSIONS ",[53,1320,1287],{"class":59},[53,1322,125],{"class":63},[53,1324,1325],{"class":55,"line":128},[53,1326,78],{"emptyLinePlaceholder":77},[53,1328,1329,1331,1334,1336],{"class":55,"line":133},[53,1330,1262],{"class":59},[53,1332,1333],{"class":63},"(CMAKE_EXPORT_COMPILE_COMMANDS ",[53,1335,1275],{"class":59},[53,1337,125],{"class":63},[53,1339,1341],{"class":55,"line":1340},10,[53,1342,78],{"emptyLinePlaceholder":77},[53,1344,1346,1349,1352,1355],{"class":55,"line":1345},11,[53,1347,1348],{"class":59},"add_library",[53,1350,1351],{"class":63},"(project_options ",[53,1353,1354],{"class":67},"INTERFACE",[53,1356,125],{"class":63},[53,1358,1360,1363,1365,1367],{"class":55,"line":1359},12,[53,1361,1362],{"class":59},"target_compile_features",[53,1364,1351],{"class":63},[53,1366,1354],{"class":67},[53,1368,1369],{"class":63}," cxx_std_20)\n",[53,1371,1373],{"class":55,"line":1372},13,[53,1374,78],{"emptyLinePlaceholder":77},[53,1376,1378,1380,1383,1385],{"class":55,"line":1377},14,[53,1379,1348],{"class":59},[53,1381,1382],{"class":63},"(project_warnings ",[53,1384,1354],{"class":67},[53,1386,125],{"class":63},[53,1388,1390,1393,1395],{"class":55,"line":1389},15,[53,1391,1392],{"class":59},"target_compile_options",[53,1394,1382],{"class":63},[53,1396,1397],{"class":67},"INTERFACE\n",[53,1399,1401],{"class":55,"line":1400},16,[53,1402,1403],{"class":63},"  -Wall\n",[53,1405,1407],{"class":55,"line":1406},17,[53,1408,1409],{"class":63},"  -Wextra\n",[53,1411,1413],{"class":55,"line":1412},18,[53,1414,1415],{"class":63},"  -Wpedantic\n",[53,1417,1419],{"class":55,"line":1418},19,[53,1420,125],{"class":63},[12,1422,1423],{},"这个文件只放项目公共选项，不放 Eigen、OpenCV 等第三方依赖。",[35,1425,1427],{"id":1426},"cmake_cxx_standard",[23,1428,1429],{},"CMAKE_CXX_STANDARD",[44,1431,1433],{"className":46,"code":1432,"language":48,"meta":49,"style":49},"set(CMAKE_CXX_STANDARD 20)\n",[23,1434,1435],{"__ignoreMap":49},[53,1436,1437,1439],{"class":55,"line":56},[53,1438,1262],{"class":59},[53,1440,1265],{"class":63},[12,1442,1443],{},"设置默认 C++ 标准。",[12,1445,641],{},[233,1447,1448,1457],{},[236,1449,1450],{},[239,1451,1452,1454],{},[242,1453,408],{"align":244},[242,1455,1456],{"align":244},"标准",[250,1458,1459,1469,1479,1489,1499],{},[239,1460,1461,1466],{},[255,1462,1463],{"align":244},[23,1464,1465],{},"11",[255,1467,1468],{"align":244},"C++11",[239,1470,1471,1476],{},[255,1472,1473],{"align":244},[23,1474,1475],{},"14",[255,1477,1478],{"align":244},"C++14",[239,1480,1481,1486],{},[255,1482,1483],{"align":244},[23,1484,1485],{},"17",[255,1487,1488],{"align":244},"C++17",[239,1490,1491,1496],{},[255,1492,1493],{"align":244},[23,1494,1495],{},"20",[255,1497,1498],{"align":244},"C++20",[239,1500,1501,1506],{},[255,1502,1503],{"align":244},[23,1504,1505],{},"23",[255,1507,1508],{"align":244},"C++23",[12,1510,1511],{},"本模板默认使用 C++20：",[44,1513,1514],{"className":46,"code":1432,"language":48,"meta":49,"style":49},[23,1515,1516],{"__ignoreMap":49},[53,1517,1518,1520],{"class":55,"line":56},[53,1519,1262],{"class":59},[53,1521,1265],{"class":63},[12,1523,1524],{},"如果想用 C++23：",[44,1526,1528],{"className":46,"code":1527,"language":48,"meta":49,"style":49},"set(CMAKE_CXX_STANDARD 23)\ntarget_compile_features(project_options INTERFACE cxx_std_23)\n",[23,1529,1530,1537],{"__ignoreMap":49},[53,1531,1532,1534],{"class":55,"line":56},[53,1533,1262],{"class":59},[53,1535,1536],{"class":63},"(CMAKE_CXX_STANDARD 23)\n",[53,1538,1539,1541,1543,1545],{"class":55,"line":74},[53,1540,1362],{"class":59},[53,1542,1351],{"class":63},[53,1544,1354],{"class":67},[53,1546,1547],{"class":63}," cxx_std_23)\n",[12,1549,1550],{},"注意两个地方最好一起改。",[12,1552,1553,1554,1557,1558,1563],{},"CMake 版本和 C++ 标准版本需要分别判断。CMake 3.22 已能识别 ",[23,1555,1556],{},"cxx_std_20","，但这表示选择相应的编译器标准模式，不代表编译器和标准库已经实现全部 C++20 功能；具体说明见 ",[304,1559,1562],{"href":1560,"rel":1561},"https:\u002F\u002Fcmake.org\u002Fcmake\u002Fhelp\u002Fv3.22\u002Fprop_gbl\u002FCMAKE_CXX_KNOWN_FEATURES.html",[308],"CMake 编译特性文档","。模板当前的 Eigen 示例已使用 GCC 11.4 验证，后续程序用到的新语法和标准库功能仍需对应的编译器支持。",[35,1565,1567],{"id":1566},"cmake_cxx_standard_required",[23,1568,1569],{},"CMAKE_CXX_STANDARD_REQUIRED",[44,1571,1573],{"className":46,"code":1572,"language":48,"meta":49,"style":49},"set(CMAKE_CXX_STANDARD_REQUIRED ON)\n",[23,1574,1575],{"__ignoreMap":49},[53,1576,1577,1579,1581,1583],{"class":55,"line":56},[53,1578,1262],{"class":59},[53,1580,1272],{"class":63},[53,1582,1275],{"class":59},[53,1584,125],{"class":63},[12,1586,1587],{},"作用：要求编译器必须支持指定的 C++ 标准。",[12,1589,180],{},[233,1591,1592,1600],{},[236,1593,1594],{},[239,1595,1596,1598],{},[242,1597,408],{"align":244},[242,1599,248],{"align":244},[250,1601,1602,1611],{},[239,1603,1604,1608],{},[255,1605,1606],{"align":244},[23,1607,1275],{},[255,1609,1610],{"align":244},"必须使用指定标准，不支持就报错",[239,1612,1613,1617],{},[255,1614,1615],{"align":244},[23,1616,1287],{},[255,1618,1619],{"align":244},"不支持时可能退回较低标准",[12,1621,1622,1623,1625],{},"模板建议写 ",[23,1624,1275],{},"，使不支持所选标准模式的编译器明确报错，避免静默退回旧标准。",[35,1627,1629],{"id":1628},"cmake_cxx_extensions",[23,1630,1631],{},"CMAKE_CXX_EXTENSIONS",[44,1633,1635],{"className":46,"code":1634,"language":48,"meta":49,"style":49},"set(CMAKE_CXX_EXTENSIONS OFF)\n",[23,1636,1637],{"__ignoreMap":49},[53,1638,1639,1641,1643,1645],{"class":55,"line":56},[53,1640,1262],{"class":59},[53,1642,1284],{"class":63},[53,1644,1287],{"class":59},[53,1646,125],{"class":63},[12,1648,1649],{},"作用：控制是否使用编译器扩展标准。",[12,1651,180],{},[233,1653,1654,1665],{},[236,1655,1656],{},[239,1657,1658,1660,1663],{},[242,1659,408],{"align":244},[242,1661,1662],{"align":244},"编译选项倾向",[242,1664,248],{"align":244},[250,1666,1667,1681],{},[239,1668,1669,1673,1678],{},[255,1670,1671],{"align":244},[23,1672,1275],{},[255,1674,1675],{"align":244},[23,1676,1677],{},"gnu++20",[255,1679,1680],{"align":244},"允许 GNU 扩展",[239,1682,1683,1687,1692],{},[255,1684,1685],{"align":244},[23,1686,1287],{},[255,1688,1689],{"align":244},[23,1690,1691],{},"c++20",[255,1693,1694],{"align":244},"使用所选标准的非 GNU 扩展模式",[12,1696,1697,1698,1700],{},"表中以模板默认的 C++20 为例，具体参数拼写由 CMake 根据编译器选择。Linux-only 项目也建议先写 ",[23,1699,1287],{},"，这样代码更接近标准 C++。",[35,1702,1704],{"id":1703},"c-标准相关选项","C 标准相关选项",[44,1706,1708],{"className":46,"code":1707,"language":48,"meta":49,"style":49},"set(CMAKE_C_STANDARD 11)\nset(CMAKE_C_STANDARD_REQUIRED ON)\nset(CMAKE_C_EXTENSIONS OFF)\n",[23,1709,1710,1716,1726],{"__ignoreMap":49},[53,1711,1712,1714],{"class":55,"line":56},[53,1713,1262],{"class":59},[53,1715,1300],{"class":63},[53,1717,1718,1720,1722,1724],{"class":55,"line":74},[53,1719,1262],{"class":59},[53,1721,1307],{"class":63},[53,1723,1275],{"class":59},[53,1725,125],{"class":63},[53,1727,1728,1730,1732,1734],{"class":55,"line":81},[53,1729,1262],{"class":59},[53,1731,1318],{"class":63},[53,1733,1287],{"class":59},[53,1735,125],{"class":63},[12,1737,1738],{},"含义和 C++ 对应选项类似。",[12,1740,1741],{},"常见 C 标准：",[233,1743,1744,1752],{},[236,1745,1746],{},[239,1747,1748,1750],{},[242,1749,408],{"align":244},[242,1751,1456],{"align":244},[250,1753,1754,1764,1773,1782],{},[239,1755,1756,1761],{},[255,1757,1758],{"align":244},[23,1759,1760],{},"99",[255,1762,1763],{"align":244},"C99",[239,1765,1766,1770],{},[255,1767,1768],{"align":244},[23,1769,1465],{},[255,1771,1772],{"align":244},"C11",[239,1774,1775,1779],{},[255,1776,1777],{"align":244},[23,1778,1485],{},[255,1780,1781],{"align":244},"C17",[239,1783,1784,1788],{},[255,1785,1786],{"align":244},[23,1787,1505],{},[255,1789,1790],{"align":244},"C23",[12,1792,1793,1794,1797],{},"如果项目没有 ",[23,1795,1796],{},".c"," 文件，也可以只启用 C++：",[44,1799,1800],{"className":46,"code":707,"language":48,"meta":49,"style":49},[23,1801,1802],{"__ignoreMap":49},[53,1803,1804,1806,1808,1810],{"class":55,"line":56},[53,1805,84],{"class":59},[53,1807,87],{"class":63},[53,1809,68],{"class":67},[53,1811,720],{"class":63},[12,1813,1814],{},"然后删除 C 标准相关设置。",[35,1816,1818],{"id":1817},"cmake_export_compile_commands",[23,1819,1820],{},"CMAKE_EXPORT_COMPILE_COMMANDS",[44,1822,1824],{"className":46,"code":1823,"language":48,"meta":49,"style":49},"set(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n",[23,1825,1826],{"__ignoreMap":49},[53,1827,1828,1830,1832,1834],{"class":55,"line":56},[53,1829,1262],{"class":59},[53,1831,1333],{"class":63},[53,1833,1275],{"class":59},[53,1835,125],{"class":63},[12,1837,1838,1839,342],{},"作用：生成 ",[23,1840,1841],{},"compile_commands.json",[12,1843,1844],{},"可以填：",[233,1846,1847,1855],{},[236,1848,1849],{},[239,1850,1851,1853],{},[242,1852,408],{"align":244},[242,1854,248],{"align":244},[250,1856,1857,1866],{},[239,1858,1859,1863],{},[255,1860,1861],{"align":244},[23,1862,1275],{},[255,1864,1865],{"align":244},"生成",[239,1867,1868,1872],{},[255,1869,1870],{"align":244},[23,1871,1287],{},[255,1873,1874],{"align":244},"不生成",[12,1876,1877,1878,1880],{},"这个选项在 ",[23,1879,337],{}," 中也写了：",[44,1882,1886],{"className":1883,"code":1884,"language":1885,"meta":49,"style":49},"language-json shiki shiki-themes github-light github-dark","\"CMAKE_EXPORT_COMPILE_COMMANDS\": \"ON\"\n","json",[23,1887,1888],{"__ignoreMap":49},[53,1889,1890,1893,1896],{"class":55,"line":56},[53,1891,1892],{"class":121},"\"CMAKE_EXPORT_COMPILE_COMMANDS\"",[53,1894,1895],{"class":63},": ",[53,1897,1898],{"class":121},"\"ON\"\n",[12,1900,1901,1902,1905],{},"两个地方都写不冲突。preset 的好处是 IDE 和命令行都能明确看到这个配置；",[23,1903,1904],{},"ProjectOptions.cmake"," 的好处是即使不用 preset，也默认开启。",[35,1907,1909],{"id":1908},"add_libraryproject_options-interface",[23,1910,1911],{},"add_library(project_options INTERFACE)",[44,1913,1915],{"className":46,"code":1914,"language":48,"meta":49,"style":49},"add_library(project_options INTERFACE)\n",[23,1916,1917],{"__ignoreMap":49},[53,1918,1919,1921,1923,1925],{"class":55,"line":56},[53,1920,1348],{"class":59},[53,1922,1351],{"class":63},[53,1924,1354],{"class":67},[53,1926,125],{"class":63},[12,1928,1929],{},"创建一个 interface target。",[12,1931,1932,1934,1935,802,1938,1941],{},[23,1933,1354],{}," target 没有源码，不会生成 ",[23,1936,1937],{},".a",[23,1939,1940],{},".so","。它只用来携带编译特性、宏定义、include 路径、链接依赖等\"使用要求\"。",[12,1943,1944,1946],{},[23,1945,1348],{}," 常见类型：",[233,1948,1949,1964],{},[236,1950,1951],{},[239,1952,1953,1956,1959,1962],{},[242,1954,1955],{"align":244},"类型",[242,1957,1958],{"align":244},"是否有源码",[242,1960,1961],{"align":244},"是否生成产物",[242,1963,772],{"align":244},[250,1965,1966,1983,1999,2013,2031],{},[239,1967,1968,1973,1976,1980],{},[255,1969,1970],{"align":244},[23,1971,1972],{},"STATIC",[255,1974,1975],{"align":244},"有",[255,1977,1978],{"align":244},[23,1979,1937],{},[255,1981,1982],{"align":244},"静态库",[239,1984,1985,1990,1992,1996],{},[255,1986,1987],{"align":244},[23,1988,1989],{},"SHARED",[255,1991,1975],{"align":244},[255,1993,1994],{"align":244},[23,1995,1940],{},[255,1997,1998],{"align":244},"动态库",[239,2000,2001,2006,2008,2011],{},[255,2002,2003],{"align":244},[23,2004,2005],{},"MODULE",[255,2007,1975],{"align":244},[255,2009,2010],{"align":244},"插件式动态模块",[255,2012],{"align":244},[239,2014,2015,2020,2022,2028],{},[255,2016,2017],{"align":244},[23,2018,2019],{},"OBJECT",[255,2021,1975],{"align":244},[255,2023,2024,2027],{"align":244},[23,2025,2026],{},".o"," 集合",[255,2029,2030],{"align":244},"复用对象文件",[239,2032,2033,2037,2040,2042],{},[255,2034,2035],{"align":244},[23,2036,1354],{},[255,2038,2039],{"align":244},"无",[255,2041,2039],{"align":244},[255,2043,2044],{"align":244},"传递配置",[12,2046,2047],{},"本模板用：",[44,2049,2051],{"className":46,"code":2050,"language":48,"meta":49,"style":49},"project_options\n",[23,2052,2053],{"__ignoreMap":49},[53,2054,2055],{"class":55,"line":56},[53,2056,2050],{"class":63},[12,2058,2059],{},"保存 C++ 标准要求。",[35,2061,2062],{"id":1362},[23,2063,1362],{},[44,2065,2067],{"className":46,"code":2066,"language":48,"meta":49,"style":49},"target_compile_features(project_options INTERFACE cxx_std_20)\n",[23,2068,2069],{"__ignoreMap":49},[53,2070,2071,2073,2075,2077],{"class":55,"line":56},[53,2072,1362],{"class":59},[53,2074,1351],{"class":63},[53,2076,1354],{"class":67},[53,2078,1369],{"class":63},[12,2080,2081],{},"作用：声明使用这个 target 的目标至少需要 C++20 标准模式。",[12,2083,180],{},[233,2085,2086,2094],{},[236,2087,2088],{},[239,2089,2090,2092],{},[242,2091,245],{"align":244},[242,2093,248],{"align":244},[250,2095,2096,2106,2116,2126,2135],{},[239,2097,2098,2103],{},[255,2099,2100],{"align":244},[23,2101,2102],{},"cxx_std_11",[255,2104,2105],{"align":244},"至少 C++11",[239,2107,2108,2113],{},[255,2109,2110],{"align":244},[23,2111,2112],{},"cxx_std_14",[255,2114,2115],{"align":244},"至少 C++14",[239,2117,2118,2123],{},[255,2119,2120],{"align":244},[23,2121,2122],{},"cxx_std_17",[255,2124,2125],{"align":244},"至少 C++17",[239,2127,2128,2132],{},[255,2129,2130],{"align":244},[23,2131,1556],{},[255,2133,2134],{"align":244},"至少 C++20",[239,2136,2137,2142],{},[255,2138,2139],{"align":244},[23,2140,2141],{},"cxx_std_23",[255,2143,2144],{"align":244},"至少 C++23",[12,2146,2147],{},"为什么这里又写了一遍 C++20？",[44,2149,2150],{"className":46,"code":1432,"language":48,"meta":49,"style":49},[23,2151,2152],{"__ignoreMap":49},[53,2153,2154,2156],{"class":55,"line":56},[53,2155,1262],{"class":59},[53,2157,1265],{"class":63},[12,2159,2160],{},"是当前目录及其子目录中后续创建目标的默认值。",[44,2162,2163],{"className":46,"code":2066,"language":48,"meta":49,"style":49},[23,2164,2165],{"__ignoreMap":49},[53,2166,2167,2169,2171,2173],{"class":55,"line":56},[53,2168,1362],{"class":59},[53,2170,1351],{"class":63},[53,2172,1354],{"class":67},[53,2174,1369],{"class":63},[12,2176,2177],{},"是目标级要求。现代 CMake 更推荐用目标级要求，因为它能随着 target 链接关系传播。",[35,2179,2181],{"id":2180},"add_libraryproject_warnings-interface",[23,2182,2183],{},"add_library(project_warnings INTERFACE)",[44,2185,2187],{"className":46,"code":2186,"language":48,"meta":49,"style":49},"add_library(project_warnings INTERFACE)\n",[23,2188,2189],{"__ignoreMap":49},[53,2190,2191,2193,2195,2197],{"class":55,"line":56},[53,2192,1348],{"class":59},[53,2194,1382],{"class":63},[53,2196,1354],{"class":67},[53,2198,125],{"class":63},[12,2200,2201],{},"创建一个专门保存 warning 选项的 interface target。",[12,2203,2204],{},"这样每个 target 可以选择是否链接：",[44,2206,2208],{"className":46,"code":2207,"language":48,"meta":49,"style":49},"target_link_libraries(my_target\n  PRIVATE\n    project_warnings\n)\n",[23,2209,2210,2218,2223,2228],{"__ignoreMap":49},[53,2211,2212,2215],{"class":55,"line":56},[53,2213,2214],{"class":59},"target_link_libraries",[53,2216,2217],{"class":63},"(my_target\n",[53,2219,2220],{"class":55,"line":74},[53,2221,2222],{"class":67},"  PRIVATE\n",[53,2224,2225],{"class":55,"line":81},[53,2226,2227],{"class":63},"    project_warnings\n",[53,2229,2230],{"class":55,"line":95},[53,2231,125],{"class":63},[35,2233,2234],{"id":1392},[23,2235,1392],{},[44,2237,2239],{"className":46,"code":2238,"language":48,"meta":49,"style":49},"target_compile_options(project_warnings INTERFACE\n  -Wall\n  -Wextra\n  -Wpedantic\n)\n",[23,2240,2241,2249,2253,2257,2261],{"__ignoreMap":49},[53,2242,2243,2245,2247],{"class":55,"line":56},[53,2244,1392],{"class":59},[53,2246,1382],{"class":63},[53,2248,1397],{"class":67},[53,2250,2251],{"class":55,"line":74},[53,2252,1403],{"class":63},[53,2254,2255],{"class":55,"line":81},[53,2256,1409],{"class":63},[53,2258,2259],{"class":55,"line":95},[53,2260,1415],{"class":63},[53,2262,2263],{"class":55,"line":100},[53,2264,125],{"class":63},[12,2266,2267],{},"作用：给目标添加编译选项。",[12,2269,2270],{},"本模板选项：",[233,2272,2273,2283],{},[236,2274,2275],{},[239,2276,2277,2280],{},[242,2278,2279],{"align":244},"选项",[242,2281,2282],{"align":244},"作用",[250,2284,2285,2295,2305],{},[239,2286,2287,2292],{},[255,2288,2289],{"align":244},[23,2290,2291],{},"-Wall",[255,2293,2294],{"align":244},"开启一组常见警告",[239,2296,2297,2302],{},[255,2298,2299],{"align":244},[23,2300,2301],{},"-Wextra",[255,2303,2304],{"align":244},"开启更多警告",[239,2306,2307,2312],{},[255,2308,2309],{"align":244},[23,2310,2311],{},"-Wpedantic",[255,2313,2314],{"align":244},"提醒不符合标准的写法",[12,2316,2317],{},"常见可追加选项：",[233,2319,2320,2328],{},[236,2321,2322],{},[239,2323,2324,2326],{},[242,2325,2279],{"align":244},[242,2327,248],{"align":244},[250,2329,2330,2340,2350],{},[239,2331,2332,2337],{},[255,2333,2334],{"align":244},[23,2335,2336],{},"-Wconversion",[255,2338,2339],{"align":244},"类型转换可能丢失信息时警告",[239,2341,2342,2347],{},[255,2343,2344],{"align":244},[23,2345,2346],{},"-Wshadow",[255,2348,2349],{"align":244},"变量名遮蔽时警告",[239,2351,2352,2357],{},[255,2353,2354],{"align":244},[23,2355,2356],{},"-Werror",[255,2358,2359],{"align":244},"把 warning 当 error",[12,2361,2362,2363,2365],{},"不建议模板默认加 ",[23,2364,2356],{},"。因为不同编译器、不同第三方头文件可能产生不同 warning，初学阶段容易被卡住。",[35,2367,2369,2372,2373,2372,2376,2378],{"id":2368},"publicprivateinterface-的直觉",[23,2370,2371],{},"PUBLIC","、",[23,2374,2375],{},"PRIVATE",[23,2377,1354],{}," 的直觉",[12,2380,2381],{},"后面的 CMake 文件会大量出现：",[44,2383,2385],{"className":46,"code":2384,"language":48,"meta":49,"style":49},"PUBLIC\nPRIVATE\nINTERFACE\n",[23,2386,2387,2392,2397],{"__ignoreMap":49},[53,2388,2389],{"class":55,"line":56},[53,2390,2391],{"class":67},"PUBLIC\n",[53,2393,2394],{"class":55,"line":74},[53,2395,2396],{"class":67},"PRIVATE\n",[53,2398,2399],{"class":55,"line":81},[53,2400,1397],{"class":67},[12,2402,2403],{},"它们控制\"属性是否传递给使用者\"。",[233,2405,2406,2420],{},[236,2407,2408],{},[239,2409,2410,2413,2417],{},[242,2411,2412],{"align":244},"关键字",[242,2414,2416],{"align":2415},"center","自己用",[242,2418,2419],{"align":2415},"传给别人",[250,2421,2422,2434,2444],{},[239,2423,2424,2428,2431],{},[255,2425,2426],{"align":244},[23,2427,2375],{},[255,2429,2430],{"align":2415},"是",[255,2432,2433],{"align":2415},"否",[239,2435,2436,2440,2442],{},[255,2437,2438],{"align":244},[23,2439,2371],{},[255,2441,2430],{"align":2415},[255,2443,2430],{"align":2415},[239,2445,2446,2450,2452],{},[255,2447,2448],{"align":244},[23,2449,1354],{},[255,2451,2433],{"align":2415},[255,2453,2430],{"align":2415},[12,2455,2456],{},"例如：",[44,2458,2460],{"className":46,"code":2459,"language":48,"meta":49,"style":49},"target_link_libraries(lib1_src_lib\n  PUBLIC\n    project_options\n  PRIVATE\n    project_warnings\n)\n",[23,2461,2462,2469,2474,2479,2483,2487],{"__ignoreMap":49},[53,2463,2464,2466],{"class":55,"line":56},[53,2465,2214],{"class":59},[53,2467,2468],{"class":63},"(lib1_src_lib\n",[53,2470,2471],{"class":55,"line":74},[53,2472,2473],{"class":67},"  PUBLIC\n",[53,2475,2476],{"class":55,"line":81},[53,2477,2478],{"class":63},"    project_options\n",[53,2480,2481],{"class":55,"line":95},[53,2482,2222],{"class":67},[53,2484,2485],{"class":55,"line":100},[53,2486,2227],{"class":63},[53,2488,2489],{"class":55,"line":109},[53,2490,125],{"class":63},[12,2492,2493],{},"含义：",[16,2495,2496,2505,2513],{},[19,2497,2498,2501,2502,342],{},[23,2499,2500],{},"lib1_src_lib"," 自己需要 ",[23,2503,2504],{},"project_options",[19,2506,2507,2508,2510,2511,342],{},"链接 ",[23,2509,2500],{}," 的目标也会得到 ",[23,2512,2504],{},[19,2514,2515,2518,2519,2521],{},[23,2516,2517],{},"project_warnings"," 只用于编译 ",[23,2520,2500],{}," 自己，不强迫下游也开启相同 warning。",[2523,2524,2525],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":49,"searchDepth":74,"depth":74,"links":2527},[2528,2530,2531,2536,2537,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552],{"id":37,"depth":74,"text":2529},"顶层 CMakeLists.txt",{"id":60,"depth":74,"text":60},{"id":84,"depth":74,"text":84,"children":2532},[2533,2534,2535],{"id":381,"depth":81,"text":381},{"id":510,"depth":81,"text":68},{"id":623,"depth":81,"text":626},{"id":738,"depth":74,"text":741},{"id":994,"depth":74,"text":997,"children":2538},[2539,2540],{"id":103,"depth":81,"text":1020},{"id":1102,"depth":81,"text":1105},{"id":1138,"depth":74,"text":1141},{"id":1247,"depth":74,"text":30},{"id":1426,"depth":74,"text":1429},{"id":1566,"depth":74,"text":1569},{"id":1628,"depth":74,"text":1631},{"id":1703,"depth":74,"text":1704},{"id":1817,"depth":74,"text":1820},{"id":1908,"depth":74,"text":1911},{"id":1362,"depth":74,"text":1362},{"id":2180,"depth":74,"text":2183},{"id":1392,"depth":74,"text":1392},{"id":2368,"depth":74,"text":2553},"PUBLIC、PRIVATE、INTERFACE 的直觉","2200-0200","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang",{"title":5,"description":14},"wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","guCbN2CdIt9877enYvYrl1C3i3EQibwo1O_oEvbHImM",[2567,2574,2580,2586,2592,2598,2604,2610,2616,2622,2628,2634,2640,2646,2652,2658,2664,2670,2676,2682,2688,2694,2700,2706,2712,2718,2724,2730,2736,2742,2748,2754,2760,2766,2772,2778,2784,2790,2796,2802,2808,2814,2820,2826,2832,2838,2844,2850,2856,2862,2868,2874,2880,2886,2892,2898,2904,2910,2916,2922,2928,2934,2940,2946,2952,2958,2964,2970,2976,2982,2988,2994,3000,3006,3012,3018,3024,3030,3036,3042,3048,3054,3060,3066,3072,3078,3084,3086,3092,3098,3104,3110],{"path":2568,"stem":2569,"title":2570,"authors":2571,"date":2555,"chapterOrder":2572,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试",[7],"0100",0,{"path":2575,"stem":2576,"title":2577,"authors":2578,"date":2555,"chapterOrder":2579,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识",[7],"0200",{"path":2581,"stem":2582,"title":2583,"authors":2584,"date":2555,"chapterOrder":2585,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放",[7],"0300",{"path":2587,"stem":2588,"title":2589,"authors":2590,"date":2555,"chapterOrder":2591,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出",[7],"0400",{"path":2593,"stem":2594,"title":2595,"authors":2596,"date":2555,"chapterOrder":2597,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符",[7],"0500",{"path":2599,"stem":2600,"title":2601,"authors":2602,"date":2555,"chapterOrder":2603,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构",[7],"0600",{"path":2605,"stem":2606,"title":2607,"authors":2608,"date":2555,"chapterOrder":2609,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组",[7],"0700",{"path":2611,"stem":2612,"title":2613,"authors":2614,"date":2555,"chapterOrder":2615,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件",[7],"0800",{"path":2617,"stem":2618,"title":2619,"authors":2620,"date":2555,"chapterOrder":2621,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针",[7],"0900",{"path":2623,"stem":2624,"title":2625,"authors":2626,"date":2555,"chapterOrder":2627,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体",[7],"1000",{"path":2629,"stem":2630,"title":2631,"authors":2632,"date":2555,"chapterOrder":2633,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期",[7],"1100",{"path":2635,"stem":2636,"title":2637,"authors":2638,"date":2555,"chapterOrder":2639,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用",[7],"1200",{"path":2641,"stem":2642,"title":2643,"authors":2644,"date":2555,"chapterOrder":2645,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函数提高",[7],"1300",{"path":2647,"stem":2648,"title":2649,"authors":2650,"date":2555,"chapterOrder":2651,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间",[7],"1350",{"path":2653,"stem":2654,"title":2655,"authors":2656,"date":2555,"chapterOrder":2657,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装",[7],"1400-0100",{"path":2659,"stem":2660,"title":2661,"authors":2662,"date":2555,"chapterOrder":2663,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理",[7],"1400-0200",{"path":2665,"stem":2666,"title":2667,"authors":2668,"date":2555,"chapterOrder":2669,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针",[7],"1400-0300",{"path":2671,"stem":2672,"title":2673,"authors":2674,"date":2555,"chapterOrder":2675,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载",[7],"1400-0400",{"path":2677,"stem":2678,"title":2679,"authors":2680,"date":2555,"chapterOrder":2681,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承",[7],"1400-0500",{"path":2683,"stem":2684,"title":2685,"authors":2686,"date":2555,"chapterOrder":2687,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态",[7],"1400-0600",{"path":2689,"stem":2690,"title":2691,"authors":2692,"date":2555,"chapterOrder":2693,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象",[7],"1400",{"path":2695,"stem":2696,"title":2697,"authors":2698,"date":2555,"chapterOrder":2699,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函数指针",[7],"1450",{"path":2701,"stem":2702,"title":2703,"authors":2704,"date":2555,"chapterOrder":2705,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作",[7],"1500",{"path":2707,"stem":2708,"title":2709,"authors":2710,"date":2555,"chapterOrder":2711,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理",[7],"1600",{"path":2713,"stem":2714,"title":2715,"authors":2716,"date":2555,"chapterOrder":2717,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板",[7],"1700",{"path":2719,"stem":2720,"title":2721,"authors":2722,"date":2555,"chapterOrder":2723,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识",[7],"1800-0100",{"path":2725,"stem":2726,"title":2727,"authors":2728,"date":2555,"chapterOrder":2729,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array",[7],"1800-0200",{"path":2731,"stem":2732,"title":2733,"authors":2734,"date":2555,"chapterOrder":2735,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器",[7],"1800-0300",{"path":2737,"stem":2738,"title":2739,"authors":2740,"date":2555,"chapterOrder":2741,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器",[7],"1800-0400",{"path":2743,"stem":2744,"title":2745,"authors":2746,"date":2555,"chapterOrder":2747,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器",[7],"1800-0500",{"path":2749,"stem":2750,"title":2751,"authors":2752,"date":2555,"chapterOrder":2753,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器",[7],"1800-0600",{"path":2755,"stem":2756,"title":2757,"authors":2758,"date":2555,"chapterOrder":2759,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器",[7],"1800-0700",{"path":2761,"stem":2762,"title":2763,"authors":2764,"date":2555,"chapterOrder":2765,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器",[7],"1800-0800",{"path":2767,"stem":2768,"title":2769,"authors":2770,"date":2555,"chapterOrder":2771,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器",[7],"1800-0900",{"path":2773,"stem":2774,"title":2775,"authors":2776,"date":2555,"chapterOrder":2777,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器",[7],"1800-1000",{"path":2779,"stem":2780,"title":2781,"authors":2782,"date":2555,"chapterOrder":2783,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词",[7],"1800-1100",{"path":2785,"stem":2786,"title":2787,"authors":2788,"date":2555,"chapterOrder":2789,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法",[7],"1800-1200",{"path":2791,"stem":2792,"title":2793,"authors":2794,"date":2555,"chapterOrder":2795,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程",[7],"1800",{"path":2797,"stem":2798,"title":2799,"authors":2800,"date":2555,"chapterOrder":2801,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++类型转换",[7],"1900",{"path":2803,"stem":2804,"title":2805,"authors":2806,"date":2555,"chapterOrder":2807,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto",[7],"2000-0100",{"path":2809,"stem":2810,"title":2811,"authors":2812,"date":2555,"chapterOrder":2813,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr",[7],"2000-0200",{"path":2815,"stem":2816,"title":2817,"authors":2818,"date":2555,"chapterOrder":2819,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using",[7],"2000-0300",{"path":2821,"stem":2822,"title":2823,"authors":2824,"date":2555,"chapterOrder":2825,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class",[7],"2000-0400",{"path":2827,"stem":2828,"title":2829,"authors":2830,"date":2555,"chapterOrder":2831,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环",[7],"2000-0500",{"path":2833,"stem":2834,"title":2835,"authors":2836,"date":2555,"chapterOrder":2837,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定",[7],"2000-0600",{"path":2839,"stem":2840,"title":2841,"authors":2842,"date":2555,"chapterOrder":2843,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr",[7],"2000-0700",{"path":2845,"stem":2846,"title":2847,"authors":2848,"date":2555,"chapterOrder":2849,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII",[7],"2000-0800",{"path":2851,"stem":2852,"title":2853,"authors":2854,"date":2555,"chapterOrder":2855,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针",[7],"2000-0900",{"path":2857,"stem":2858,"title":2859,"authors":2860,"date":2555,"chapterOrder":2861,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义",[7],"2000-1000",{"path":2863,"stem":2864,"title":2865,"authors":2866,"date":2555,"chapterOrder":2867,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式",[7],"2000-1100",{"path":2869,"stem":2870,"title":2871,"authors":2872,"date":2555,"chapterOrder":2873,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function",[7],"2000-1200",{"path":2875,"stem":2876,"title":2877,"authors":2878,"date":2555,"chapterOrder":2879,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind",[7],"2000-1300",{"path":2881,"stem":2882,"title":2883,"authors":2884,"date":2555,"chapterOrder":2885,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional",[7],"2000-1400",{"path":2887,"stem":2888,"title":2889,"authors":2890,"date":2555,"chapterOrder":2891,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant",[7],"2000-1500",{"path":2893,"stem":2894,"title":2895,"authors":2896,"date":2555,"chapterOrder":2897,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span",[7],"2000-1600",{"path":2899,"stem":2900,"title":2901,"authors":2902,"date":2555,"chapterOrder":2903,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print",[7],"2000-1700",{"path":2905,"stem":2906,"title":2907,"authors":2908,"date":2555,"chapterOrder":2909,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono",[7],"2000-1800",{"path":2911,"stem":2912,"title":2913,"authors":2914,"date":2555,"chapterOrder":2915,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-bing-fa-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-并发是什么","并发是什么",[7],"2000-1900-0100",{"path":2917,"stem":2918,"title":2919,"authors":2920,"date":2555,"chapterOrder":2921,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-bing-xing-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-并行是什么","并行是什么",[7],"2000-1900-0200",{"path":2923,"stem":2924,"title":2925,"authors":2926,"date":2555,"chapterOrder":2927,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-xie-cheng-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-协程是什么","协程是什么",[7],"2000-1900-0300",{"path":2929,"stem":2930,"title":2931,"authors":2932,"date":2555,"chapterOrder":2933,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1000-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1000-并发编程","并发编程",[7],"2000-1900-1000",{"path":2935,"stem":2936,"title":2937,"authors":2938,"date":2555,"chapterOrder":2939,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1100-std-thread","std::thread",[7],"2000-1900-1100",{"path":2941,"stem":2942,"title":2943,"authors":2944,"date":2555,"chapterOrder":2945,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1200-mutex-lock-guard","mutex 与 RAII 锁",[7],"2000-1900-1200",{"path":2947,"stem":2948,"title":2949,"authors":2950,"date":2555,"chapterOrder":2951,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1300-std-atomic","std::atomic",[7],"2000-1900-1300",{"path":2953,"stem":2954,"title":2955,"authors":2956,"date":2555,"chapterOrder":2957,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1400-condition-variable","condition_variable",[7],"2000-1900-1400",{"path":2959,"stem":2960,"title":2961,"authors":2962,"date":2555,"chapterOrder":2963,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1500-future-async-promise","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1500-future-async-promise","future、async、promise 与 packaged_task",[7],"2000-1900-1500",{"path":2965,"stem":2966,"title":2967,"authors":2968,"date":2555,"chapterOrder":2969,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1600-jthread-stop-token","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1600-jthread-stop-token","jthread 与 stop_token",[7],"2000-1900-1600",{"path":2971,"stem":2972,"title":2973,"authors":2974,"date":2555,"chapterOrder":2975,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1700-semaphore-latch-barrier","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1700-semaphore-latch-barrier","semaphore、latch 与 barrier",[7],"2000-1900-1700",{"path":2977,"stem":2978,"title":2979,"authors":2980,"date":2555,"chapterOrder":2981,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bing-xing-yu-xie-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发并行与协程","并发、并行与协程",[7],"2000-1900",{"path":2983,"stem":2984,"title":2985,"authors":2986,"date":2555,"chapterOrder":2987,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem",[7],"2000-2000",{"path":2989,"stem":2990,"title":2991,"authors":2992,"date":2555,"chapterOrder":2993,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介",[7],"2000-2100",{"path":2995,"stem":2996,"title":2997,"authors":2998,"date":2555,"chapterOrder":2999,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++",[7],"2000",{"path":3001,"stem":3002,"title":3003,"authors":3004,"date":2555,"chapterOrder":3005,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO",[7],"2100-0100-0100",{"path":3007,"stem":3008,"title":3009,"authors":3010,"date":2555,"chapterOrder":3011,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础",[7],"2100-0100-0200",{"path":3013,"stem":3014,"title":3015,"authors":3016,"date":2555,"chapterOrder":3017,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信教学",[7],"2100-0100-0300",{"path":3019,"stem":3020,"title":3021,"authors":3022,"date":2555,"chapterOrder":3023,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0350-chuan-kou-tong-xin-chuan-kou-bao-xie-yi-shi-li","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0350-串口通信串口包协议实例","串口通信串口包协议实例",[7],"2100-0100-0350",{"path":3025,"stem":3026,"title":3027,"authors":3028,"date":2555,"chapterOrder":3029,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信",[7],"2100-0100-0400",{"path":3031,"stem":3032,"title":3033,"authors":3034,"date":2555,"chapterOrder":3035,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信",[7],"2100-0100-0500",{"path":3037,"stem":3038,"title":3039,"authors":3040,"date":2555,"chapterOrder":3041,"chapterDepth":74,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成",[7],"2100-0100-0600",{"path":3043,"stem":3044,"title":3045,"authors":3046,"date":2555,"chapterOrder":3047,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库",[7],"2100-0100",{"path":3049,"stem":3050,"title":3051,"authors":3052,"date":2555,"chapterOrder":3053,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库",[7],"2100-0200",{"path":3055,"stem":3056,"title":3057,"authors":3058,"date":2555,"chapterOrder":3059,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库",[7],"2100-0300",{"path":3061,"stem":3062,"title":3063,"authors":3064,"date":2555,"chapterOrder":3065,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库",[7],"2100-0400",{"path":3067,"stem":3068,"title":3069,"authors":3070,"date":2555,"chapterOrder":3071,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库",[7],"2100-0500",{"path":3073,"stem":3074,"title":3075,"authors":3076,"date":2555,"chapterOrder":3077,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习",[7],"2100",{"path":3079,"stem":3080,"title":3081,"authors":3082,"date":2555,"chapterOrder":3083,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装",[7],"2200-0100",{"path":2562,"stem":2564,"title":5,"authors":3085,"date":2555,"chapterOrder":2554,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},[7],{"path":3087,"stem":3088,"title":3089,"authors":3090,"date":2555,"chapterOrder":3091,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解",[7],"2200-0300",{"path":3093,"stem":3094,"title":3095,"authors":3096,"date":2555,"chapterOrder":3097,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法",[7],"2200-0400",{"path":3099,"stem":3100,"title":3101,"authors":3102,"date":2555,"chapterOrder":3103,"chapterDepth":56,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题",[7],"2200-0500",{"path":3105,"stem":3106,"title":3107,"authors":3108,"date":2555,"chapterOrder":3109,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":2560},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板",[7],"2200",{"path":2557,"stem":3111,"title":3112,"authors":3113,"date":2555,"chapterOrder":3114,"chapterDepth":2573,"docKey":2556,"docRoot":2557,"docTitle":2558,"isWikiDoc":77,"isWikiIndex":77},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",[7],null,[3116,3118,3121,3124],{"name":7,"image":3117},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":3119,"image":3120},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":3122,"image":3123},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":3125,"image":3126},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431900467]