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