[{"data":1,"prerenderedAt":3826},["ShallowReactive",2],{"wiki-page-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie":3,"wiki-doc-items-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie":3404,"language-switcher-data-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie":3810,"wiki-i18n-paths-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie":3825},{"id":4,"title":5,"body":6,"canonicalPath":3386,"chapterDepth":62,"chapterOrder":3387,"date":3388,"description":12,"docI18nKey":3389,"docKey":3390,"docRoot":3391,"docTitle":3392,"extension":3393,"i18nKey":3394,"isBlogPost":3395,"isWikiDoc":94,"isWikiIndex":3395,"layout":3396,"legacyPath":3396,"locale":3397,"localeSlug":3398,"meta":3399,"navigation":94,"path":3386,"seo":3400,"sourcePath":3401,"sourceStem":3394,"stem":3402,"wikiDepth":62,"__hash__":3403},"content\u002F_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解.md","src與lib模塊CMake詳解",{"type":7,"value":8,"toc":3357},"minimark",[9,13,40,46,49,281,284,288,311,314,317,350,353,356,364,371,390,393,401,408,420,427,433,439,442,452,455,461,464,493,507,514,525,528,545,558,561,576,579,595,598,649,653,670,736,747,753,765,973,983,1006,1009,1025,1041,1068,1083,1107,1110,1116,1129,1133,1162,1165,1172,1187,1193,1208,1211,1217,1220,1226,1229,1234,1245,1268,1274,1299,1302,1305,1311,1314,1320,1323,1334,1337,1343,1349,1355,1357,1363,1365,1371,1385,1388,1442,1449,1452,1475,1478,1484,1550,1553,1565,1568,1574,1578,1582,1891,1897,1914,1917,1923,1960,1967,1985,1988,1994,2013,2019,2046,2049,2052,2115,2118,2138,2144,2165,2168,2207,2213,2216,2243,2246,2260,2263,2275,2278,2290,2293,2299,2302,2311,2314,2318,2344,2347,2350,2436,2439,2467,2470,2497,2500,2518,2522,2561,2564,2570,2586,2592,2606,2609,2615,2618,2629,2632,2638,2644,2658,2661,2667,2670,2676,2679,2689,2696,2699,2705,2708,2720,2728,2731,2737,2739,2756,2759,2763,2798,2801,2817,2823,2832,2838,2887,2890,2893,2906,2919,2922,2959,2962,2965,3025,3028,3031,3054,3061,3067,3075,3085,3088,3093,3096,3101,3110,3114,3122,3140,3143,3148,3151,3157,3160,3185,3212,3215,3229,3232,3236,3246,3253,3269,3274,3280,3285,3303,3310,3347,3353],[10,11,12],"p",{},"本節講三個層次：",[14,15,16,24,30],"ol",{},[17,18,19,23],"li",{},[20,21,22],"code",{},"src\u002FCMakeLists.txt"," 如何創建主程序。",[17,25,26,29],{},[20,27,28],{},"src\u002Flib1\u002FCMakeLists.txt"," 如何創建庫。",[17,31,32,35,36,39],{},[20,33,34],{},"src\u002Flib2\u002FCMakeLists.txt"," 爲什麼和 ",[20,37,38],{},"lib1"," 類似但 target 不能重名。",[41,42,44],"h2",{"id":43},"srccmakeliststxt",[20,45,22],{},[10,47,48],{},"文件內容：",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-cmake shiki shiki-themes github-light github-dark","add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp\n)\n\ntarget_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    project_options\n    project_warnings\n)\n\nadd_subdirectory(lib1)\nadd_subdirectory(lib2)\n\ntarget_link_libraries(lib1_src_lib\n  PRIVATE\n    lib2_src_lib\n)\n\ntarget_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    lib1_src_lib\n    lib2_src_lib\n)\n\nset_target_properties(${PROJECT_NAME} PROPERTIES\n  INSTALL_RPATH \"$ORIGIN\u002F..\u002F${CMAKE_INSTALL_LIBDIR}\"\n)\n\ninstall(TARGETS ${PROJECT_NAME}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n","cmake","",[20,57,58,74,83,89,96,106,113,119,125,130,135,144,152,157,165,170,176,181,186,195,200,206,211,216,221,235,246,251,256,267,276],{"__ignoreMap":55},[59,60,63,67,71],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"szBVR","add_executable",[59,68,70],{"class":69},"sVt8B","(",[59,72,73],{"class":65},"${PROJECT_NAME}\n",[59,75,77,80],{"class":61,"line":76},2,[59,78,79],{"class":65},"  ${CMAKE_CURRENT_SOURCE_DIR}",[59,81,82],{"class":69},"\u002Fmain.cpp\n",[59,84,86],{"class":61,"line":85},3,[59,87,88],{"class":69},")\n",[59,90,92],{"class":61,"line":91},4,[59,93,95],{"emptyLinePlaceholder":94},true,"\n",[59,97,99,102,104],{"class":61,"line":98},5,[59,100,101],{"class":65},"target_link_libraries",[59,103,70],{"class":69},[59,105,73],{"class":65},[59,107,109],{"class":61,"line":108},6,[59,110,112],{"class":111},"sScJk","  PRIVATE\n",[59,114,116],{"class":61,"line":115},7,[59,117,118],{"class":69},"    project_options\n",[59,120,122],{"class":61,"line":121},8,[59,123,124],{"class":69},"    project_warnings\n",[59,126,128],{"class":61,"line":127},9,[59,129,88],{"class":69},[59,131,133],{"class":61,"line":132},10,[59,134,95],{"emptyLinePlaceholder":94},[59,136,138,141],{"class":61,"line":137},11,[59,139,140],{"class":65},"add_subdirectory",[59,142,143],{"class":69},"(lib1)\n",[59,145,147,149],{"class":61,"line":146},12,[59,148,140],{"class":65},[59,150,151],{"class":69},"(lib2)\n",[59,153,155],{"class":61,"line":154},13,[59,156,95],{"emptyLinePlaceholder":94},[59,158,160,162],{"class":61,"line":159},14,[59,161,101],{"class":65},[59,163,164],{"class":69},"(lib1_src_lib\n",[59,166,168],{"class":61,"line":167},15,[59,169,112],{"class":111},[59,171,173],{"class":61,"line":172},16,[59,174,175],{"class":69},"    lib2_src_lib\n",[59,177,179],{"class":61,"line":178},17,[59,180,88],{"class":69},[59,182,184],{"class":61,"line":183},18,[59,185,95],{"emptyLinePlaceholder":94},[59,187,189,191,193],{"class":61,"line":188},19,[59,190,101],{"class":65},[59,192,70],{"class":69},[59,194,73],{"class":65},[59,196,198],{"class":61,"line":197},20,[59,199,112],{"class":111},[59,201,203],{"class":61,"line":202},21,[59,204,205],{"class":69},"    lib1_src_lib\n",[59,207,209],{"class":61,"line":208},22,[59,210,175],{"class":69},[59,212,214],{"class":61,"line":213},23,[59,215,88],{"class":69},[59,217,219],{"class":61,"line":218},24,[59,220,95],{"emptyLinePlaceholder":94},[59,222,224,227,229,232],{"class":61,"line":223},25,[59,225,226],{"class":65},"set_target_properties",[59,228,70],{"class":69},[59,230,231],{"class":65},"${PROJECT_NAME}",[59,233,234],{"class":69}," PROPERTIES\n",[59,236,238,242],{"class":61,"line":237},26,[59,239,241],{"class":240},"s4XuR","  INSTALL_RPATH",[59,243,245],{"class":244},"sZZnC"," \"$ORIGIN\u002F..\u002F${CMAKE_INSTALL_LIBDIR}\"\n",[59,247,249],{"class":61,"line":248},27,[59,250,88],{"class":69},[59,252,254],{"class":61,"line":253},28,[59,255,95],{"emptyLinePlaceholder":94},[59,257,259,262,265],{"class":61,"line":258},29,[59,260,261],{"class":65},"install",[59,263,264],{"class":69},"(TARGETS ",[59,266,73],{"class":65},[59,268,270,273],{"class":61,"line":269},30,[59,271,272],{"class":69},"  RUNTIME DESTINATION ",[59,274,275],{"class":65},"${CMAKE_INSTALL_BINDIR}\n",[59,277,279],{"class":61,"line":278},31,[59,280,88],{"class":69},[10,282,283],{},"這個文件負責最終可執行文件。",[41,285,286],{"id":66},[20,287,66],{},[50,289,291],{"className":52,"code":290,"language":54,"meta":55,"style":55},"add_executable(${PROJECT_NAME}\n  ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp\n)\n",[20,292,293,301,307],{"__ignoreMap":55},[59,294,295,297,299],{"class":61,"line":62},[59,296,66],{"class":65},[59,298,70],{"class":69},[59,300,73],{"class":65},[59,302,303,305],{"class":61,"line":76},[59,304,79],{"class":65},[59,306,82],{"class":69},[59,308,309],{"class":61,"line":85},[59,310,88],{"class":69},[10,312,313],{},"作用：創建可執行文件 target。",[10,315,316],{},"常見寫法：",[50,318,320],{"className":52,"code":319,"language":54,"meta":55,"style":55},"add_executable(app main.cpp)\nadd_executable(robot_main main.cpp robot.cpp)\nadd_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp)\n",[20,321,322,329,336],{"__ignoreMap":55},[59,323,324,326],{"class":61,"line":62},[59,325,66],{"class":65},[59,327,328],{"class":69},"(app main.cpp)\n",[59,330,331,333],{"class":61,"line":76},[59,332,66],{"class":65},[59,334,335],{"class":69},"(robot_main main.cpp robot.cpp)\n",[59,337,338,340,342,344,347],{"class":61,"line":85},[59,339,66],{"class":65},[59,341,70],{"class":69},[59,343,231],{"class":65},[59,345,346],{"class":65}," ${CMAKE_CURRENT_SOURCE_DIR}",[59,348,349],{"class":69},"\u002Fmain.cpp)\n",[10,351,352],{},"第一個參數是 target 名，也通常是生成的可執行文件名。",[10,354,355],{},"本模板使用：",[50,357,358],{"className":52,"code":73,"language":54,"meta":55,"style":55},[20,359,360],{"__ignoreMap":55},[59,361,362],{"class":61,"line":62},[59,363,73],{"class":65},[10,365,366,367,370],{},"而 ",[20,368,369],{},"PROJECT_NAME"," 來自頂層：",[50,372,374],{"className":52,"code":373,"language":54,"meta":55,"style":55},"project(cmake_template VERSION 1.0.0 LANGUAGES C CXX)\n",[20,375,376],{"__ignoreMap":55},[59,377,378,381,384,387],{"class":61,"line":62},[59,379,380],{"class":65},"project",[59,382,383],{"class":69},"(cmake_template ",[59,385,386],{"class":111},"VERSION",[59,388,389],{"class":69}," 1.0.0 LANGUAGES C CXX)\n",[10,391,392],{},"所以可執行文件叫：",[50,394,399],{"className":395,"code":397,"language":398,"meta":55},[396],"language-text","cmake_template\n","text",[20,400,397],{"__ignoreMap":55},[402,403,405],"h3",{"id":404},"cmake_current_source_dir",[20,406,407],{},"CMAKE_CURRENT_SOURCE_DIR",[50,409,411],{"className":52,"code":410,"language":54,"meta":55,"style":55},"${CMAKE_CURRENT_SOURCE_DIR}\u002Fmain.cpp\n",[20,412,413],{"__ignoreMap":55},[59,414,415,418],{"class":61,"line":62},[59,416,417],{"class":65},"${CMAKE_CURRENT_SOURCE_DIR}",[59,419,82],{"class":69},[10,421,422,423,426],{},"表示當前 ",[20,424,425],{},"CMakeLists.txt"," 所在源碼目錄。",[10,428,429,430,432],{},"在 ",[20,431,22],{}," 中：",[50,434,437],{"className":435,"code":436,"language":398,"meta":55},[396],"CMAKE_CURRENT_SOURCE_DIR = 项目根目录\u002Fsrc\n",[20,438,436],{"__ignoreMap":55},[10,440,441],{},"所以：",[50,443,444],{"className":52,"code":410,"language":54,"meta":55,"style":55},[20,445,446],{"__ignoreMap":55},[59,447,448,450],{"class":61,"line":62},[59,449,417],{"class":65},[59,451,82],{"class":69},[10,453,454],{},"就是：",[50,456,459],{"className":457,"code":458,"language":398,"meta":55},[396],"项目根目录\u002Fsrc\u002Fmain.cpp\n",[20,460,458],{"__ignoreMap":55},[41,462,463],{"id":463},"給主程序鏈接公共選項",[50,465,467],{"className":52,"code":466,"language":54,"meta":55,"style":55},"target_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    project_options\n    project_warnings\n)\n",[20,468,469,477,481,485,489],{"__ignoreMap":55},[59,470,471,473,475],{"class":61,"line":62},[59,472,101],{"class":65},[59,474,70],{"class":69},[59,476,73],{"class":65},[59,478,479],{"class":61,"line":76},[59,480,112],{"class":111},[59,482,483],{"class":61,"line":85},[59,484,118],{"class":69},[59,486,487],{"class":61,"line":91},[59,488,124],{"class":69},[59,490,491],{"class":61,"line":98},[59,492,88],{"class":69},[10,494,495,496,499,500,503,504,506],{},"雖然 ",[20,497,498],{},"project_options"," 和 ",[20,501,502],{},"project_warnings"," 不是普通庫，但它們是 CMake target，所以也通過 ",[20,505,101],{}," 傳遞。",[10,508,509,510,513],{},"這裏用 ",[20,511,512],{},"PRIVATE","，表示：",[14,515,516,519,522],{},[17,517,518],{},"主程序自己使用 C++17 編譯要求。",[17,520,521],{},"主程序自己開啓 warning。",[17,523,524],{},"主程序不需要把這些要求再傳給別人，因爲可執行文件一般不會被其他 target 鏈接。",[41,526,527],{"id":527},"添加子目錄",[50,529,531],{"className":52,"code":530,"language":54,"meta":55,"style":55},"add_subdirectory(lib1)\nadd_subdirectory(lib2)\n",[20,532,533,539],{"__ignoreMap":55},[59,534,535,537],{"class":61,"line":62},[59,536,140],{"class":65},[59,538,143],{"class":69},[59,540,541,543],{"class":61,"line":76},[59,542,140],{"class":65},[59,544,151],{"class":69},[10,546,547,548,499,551,554,555,557],{},"作用：進入 ",[20,549,550],{},"src\u002Flib1",[20,552,553],{},"src\u002Flib2","，讀取它們各自的 ",[20,556,425],{},"。",[10,559,560],{},"執行完這兩行之後，下面兩個 target 才存在：",[50,562,564],{"className":52,"code":563,"language":54,"meta":55,"style":55},"lib1_src_lib\nlib2_src_lib\n",[20,565,566,571],{"__ignoreMap":55},[59,567,568],{"class":61,"line":62},[59,569,570],{"class":69},"lib1_src_lib\n",[59,572,573],{"class":61,"line":76},[59,574,575],{"class":69},"lib2_src_lib\n",[10,577,578],{},"所以通常先：",[50,580,581],{"className":52,"code":530,"language":54,"meta":55,"style":55},[20,582,583,589],{"__ignoreMap":55},[59,584,585,587],{"class":61,"line":62},[59,586,140],{"class":65},[59,588,143],{"class":69},[59,590,591,593],{"class":61,"line":76},[59,592,140],{"class":65},[59,594,151],{"class":69},[10,596,597],{},"再設置庫之間的依賴和主程序要鏈接的庫：",[50,599,601],{"className":52,"code":600,"language":54,"meta":55,"style":55},"target_link_libraries(lib1_src_lib\n  PRIVATE\n    lib2_src_lib\n)\n\ntarget_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    lib1_src_lib\n    lib2_src_lib\n)\n",[20,602,603,609,613,617,621,625,633,637,641,645],{"__ignoreMap":55},[59,604,605,607],{"class":61,"line":62},[59,606,101],{"class":65},[59,608,164],{"class":69},[59,610,611],{"class":61,"line":76},[59,612,112],{"class":111},[59,614,615],{"class":61,"line":85},[59,616,175],{"class":69},[59,618,619],{"class":61,"line":91},[59,620,88],{"class":69},[59,622,623],{"class":61,"line":98},[59,624,95],{"emptyLinePlaceholder":94},[59,626,627,629,631],{"class":61,"line":108},[59,628,101],{"class":65},[59,630,70],{"class":69},[59,632,73],{"class":65},[59,634,635],{"class":61,"line":115},[59,636,112],{"class":111},[59,638,639],{"class":61,"line":121},[59,640,205],{"class":69},[59,642,643],{"class":61,"line":127},[59,644,175],{"class":69},[59,646,647],{"class":61,"line":132},[59,648,88],{"class":69},[41,650,652],{"id":651},"讓-lib1-單向調用-lib2","讓 lib1 單向調用 lib2",[10,654,655,656,658,659,662,663,666,667,669],{},"本模板現在用 ",[20,657,38],{}," 調用 ",[20,660,661],{},"lib2"," 做一個單向依賴示例。",[20,664,665],{},"src\u002Fmain.cpp"," 只直接調用 ",[20,668,38],{},"：",[50,671,675],{"className":672,"code":673,"language":674,"meta":55,"style":55},"language-cpp shiki shiki-themes github-light github-dark","#include \"lib1\u002Feigen3_test.hpp\"\n\nint main()\n{\n    lib1::run_eigen_vector_example();\n    return 0;\n}\n","cpp",[20,676,677,685,689,700,705,719,731],{"__ignoreMap":55},[59,678,679,682],{"class":61,"line":62},[59,680,681],{"class":65},"#include",[59,683,684],{"class":244}," \"lib1\u002Feigen3_test.hpp\"\n",[59,686,687],{"class":61,"line":76},[59,688,95],{"emptyLinePlaceholder":94},[59,690,691,694,697],{"class":61,"line":85},[59,692,693],{"class":65},"int",[59,695,696],{"class":111}," main",[59,698,699],{"class":69},"()\n",[59,701,702],{"class":61,"line":91},[59,703,704],{"class":69},"{\n",[59,706,707,710,713,716],{"class":61,"line":98},[59,708,709],{"class":111},"    lib1",[59,711,712],{"class":69},"::",[59,714,715],{"class":111},"run_eigen_vector_example",[59,717,718],{"class":69},"();\n",[59,720,721,724,728],{"class":61,"line":108},[59,722,723],{"class":65},"    return",[59,725,727],{"class":726},"sj4cs"," 0",[59,729,730],{"class":69},";\n",[59,732,733],{"class":61,"line":115},[59,734,735],{"class":69},"}\n",[10,737,738],{},[739,740,741,742,499,744,746],"strong",{},"運行結果（完整工程鏈接 ",[20,743,38],{},[20,745,661],{}," 後）：",[50,748,751],{"className":749,"code":750,"language":398,"meta":55},[396],"[lib1] Vector v = 1 2 3\n[lib1] Norm = 3.74166\n[lib2] Matrix m =\n1 2\n3 4\n[lib2] Determinant = -2\n",[20,752,750],{"__ignoreMap":55},[10,754,755,756,759,760,762,763,669],{},"然後在 ",[20,757,758],{},"src\u002Flib1\u002Fsrc\u002Feigen3_test.cpp"," 中，",[20,761,38],{}," 再調用 ",[20,764,661],{},[50,766,768],{"className":672,"code":767,"language":674,"meta":55,"style":55},"#include \"lib1\u002Feigen3_test.hpp\"\n#include \"lib2\u002Feigen3_test.hpp\"\n\n#include \u003CEigen\u002FDense>\n#include \u003Ciostream>\n\nnamespace lib1 {\n\nvoid run_eigen_vector_example()\n{\n    const Eigen::Vector3d vector(1.0, 2.0, 3.0);\n\n    std::cout \u003C\u003C \"[lib1] Vector v = \" \u003C\u003C vector.transpose() \u003C\u003C '\\n';\n    std::cout \u003C\u003C \"[lib1] Norm = \" \u003C\u003C vector.norm() \u003C\u003C '\\n';\n\n    lib2::run_eigen_matrix_example();\n}\n\n}  \u002F\u002F namespace lib1\n",[20,769,770,776,783,787,794,801,805,816,820,830,834,867,871,910,940,944,956,960,964],{"__ignoreMap":55},[59,771,772,774],{"class":61,"line":62},[59,773,681],{"class":65},[59,775,684],{"class":244},[59,777,778,780],{"class":61,"line":76},[59,779,681],{"class":65},[59,781,782],{"class":244}," \"lib2\u002Feigen3_test.hpp\"\n",[59,784,785],{"class":61,"line":85},[59,786,95],{"emptyLinePlaceholder":94},[59,788,789,791],{"class":61,"line":91},[59,790,681],{"class":65},[59,792,793],{"class":244}," \u003CEigen\u002FDense>\n",[59,795,796,798],{"class":61,"line":98},[59,797,681],{"class":65},[59,799,800],{"class":244}," \u003Ciostream>\n",[59,802,803],{"class":61,"line":108},[59,804,95],{"emptyLinePlaceholder":94},[59,806,807,810,813],{"class":61,"line":115},[59,808,809],{"class":65},"namespace",[59,811,812],{"class":111}," lib1",[59,814,815],{"class":69}," {\n",[59,817,818],{"class":61,"line":121},[59,819,95],{"emptyLinePlaceholder":94},[59,821,822,825,828],{"class":61,"line":127},[59,823,824],{"class":65},"void",[59,826,827],{"class":111}," run_eigen_vector_example",[59,829,699],{"class":69},[59,831,832],{"class":61,"line":132},[59,833,704],{"class":69},[59,835,836,839,842,845,848,850,853,856,859,861,864],{"class":61,"line":137},[59,837,838],{"class":65},"    const",[59,840,841],{"class":111}," Eigen",[59,843,844],{"class":69},"::Vector3d ",[59,846,847],{"class":111},"vector",[59,849,70],{"class":69},[59,851,852],{"class":726},"1.0",[59,854,855],{"class":69},", ",[59,857,858],{"class":726},"2.0",[59,860,855],{"class":69},[59,862,863],{"class":726},"3.0",[59,865,866],{"class":69},");\n",[59,868,869],{"class":61,"line":146},[59,870,95],{"emptyLinePlaceholder":94},[59,872,873,876,879,882,885,888,891,894,897,899,902,905,908],{"class":61,"line":154},[59,874,875],{"class":111},"    std",[59,877,878],{"class":69},"::cout ",[59,880,881],{"class":65},"\u003C\u003C",[59,883,884],{"class":244}," \"[lib1] Vector v = \"",[59,886,887],{"class":65}," \u003C\u003C",[59,889,890],{"class":69}," vector.",[59,892,893],{"class":111},"transpose",[59,895,896],{"class":69},"() ",[59,898,881],{"class":65},[59,900,901],{"class":244}," '",[59,903,904],{"class":726},"\\n",[59,906,907],{"class":244},"'",[59,909,730],{"class":69},[59,911,912,914,916,918,921,923,925,928,930,932,934,936,938],{"class":61,"line":159},[59,913,875],{"class":111},[59,915,878],{"class":69},[59,917,881],{"class":65},[59,919,920],{"class":244}," \"[lib1] Norm = \"",[59,922,887],{"class":65},[59,924,890],{"class":69},[59,926,927],{"class":111},"norm",[59,929,896],{"class":69},[59,931,881],{"class":65},[59,933,901],{"class":244},[59,935,904],{"class":726},[59,937,907],{"class":244},[59,939,730],{"class":69},[59,941,942],{"class":61,"line":167},[59,943,95],{"emptyLinePlaceholder":94},[59,945,946,949,951,954],{"class":61,"line":172},[59,947,948],{"class":111},"    lib2",[59,950,712],{"class":69},[59,952,953],{"class":111},"run_eigen_matrix_example",[59,955,718],{"class":69},[59,957,958],{"class":61,"line":178},[59,959,735],{"class":69},[59,961,962],{"class":61,"line":183},[59,963,95],{"emptyLinePlaceholder":94},[59,965,966,969],{"class":61,"line":188},[59,967,968],{"class":69},"}",[59,970,972],{"class":971},"sJ8bj","  \u002F\u002F namespace lib1\n",[10,974,975,976,979,980,669],{},"因此 ",[20,977,978],{},"lib1_src_lib"," 必須顯式鏈接 ",[20,981,982],{},"lib2_src_lib",[50,984,986],{"className":52,"code":985,"language":54,"meta":55,"style":55},"target_link_libraries(lib1_src_lib\n  PRIVATE\n    lib2_src_lib\n)\n",[20,987,988,994,998,1002],{"__ignoreMap":55},[59,989,990,992],{"class":61,"line":62},[59,991,101],{"class":65},[59,993,164],{"class":69},[59,995,996],{"class":61,"line":76},[59,997,112],{"class":111},[59,999,1000],{"class":61,"line":85},[59,1001,175],{"class":69},[59,1003,1004],{"class":61,"line":91},[59,1005,88],{"class":69},[10,1007,1008],{},"這句話建議放在：",[50,1010,1011],{"className":52,"code":530,"language":54,"meta":55,"style":55},[20,1012,1013,1019],{"__ignoreMap":55},[59,1014,1015,1017],{"class":61,"line":62},[59,1016,140],{"class":65},[59,1018,143],{"class":69},[59,1020,1021,1023],{"class":61,"line":76},[59,1022,140],{"class":65},[59,1024,151],{"class":69},[10,1026,1027,1028,499,1031,1034,1035,1037,1038,1040],{},"之後。因爲執行完 ",[20,1029,1030],{},"add_subdirectory(lib1)",[20,1032,1033],{},"add_subdirectory(lib2)"," 後，",[20,1036,978],{},"、",[20,1039,982],{}," 這兩個 target 才都已經存在。",[10,1042,509,1043,1045,1046,1048,1049,1051,1052,1054,1055,1058,1059,1061,1062,1064,1065,1067],{},[20,1044,512],{},"，表示 ",[20,1047,661],{}," 只是 ",[20,1050,38],{}," 自己實現時需要用到的庫。CMake 會讓 ",[20,1053,38],{}," 在編譯時找到 ",[20,1056,1057],{},"lib2\u002Feigen3_test.hpp","，也會在鏈接時找到 ",[20,1060,661],{}," 裏的函數實現，但不會強迫所有鏈接 ",[20,1063,38],{}," 的目標都自動使用 ",[20,1066,661],{}," 的頭文件。",[10,1069,1070,1071,1073,1074,1076,1077,1079,1080,669],{},"如果以後 ",[20,1072,38],{}," 的公開頭文件裏直接包含了 ",[20,1075,661],{}," 的頭文件，或者公開接口裏使用了 ",[20,1078,661],{}," 的類型，就應該改成 ",[20,1081,1082],{},"PUBLIC",[50,1084,1086],{"className":52,"code":1085,"language":54,"meta":55,"style":55},"target_link_libraries(lib1_src_lib\n  PUBLIC\n    lib2_src_lib\n)\n",[20,1087,1088,1094,1099,1103],{"__ignoreMap":55},[59,1089,1090,1092],{"class":61,"line":62},[59,1091,101],{"class":65},[59,1093,164],{"class":69},[59,1095,1096],{"class":61,"line":76},[59,1097,1098],{"class":111},"  PUBLIC\n",[59,1100,1101],{"class":61,"line":85},[59,1102,175],{"class":69},[59,1104,1105],{"class":61,"line":91},[59,1106,88],{"class":69},[10,1108,1109],{},"注意，這裏是單向依賴：",[50,1111,1114],{"className":1112,"code":1113,"language":398,"meta":55},[396],"lib1 -> lib2\n",[20,1115,1113],{"__ignoreMap":55},[10,1117,1118,1119,1121,1122,1124,1125,1128],{},"不要再反過來讓 ",[20,1120,661],{}," 鏈接 ",[20,1123,38],{},"。如果兩個庫真的需要使用同一段代碼，通常應該把公共部分抽到 ",[20,1126,1127],{},"common"," 之類的新庫中。",[41,1130,1132],{"id":1131},"鏈接-lib1-和-lib2","鏈接 lib1 和 lib2",[50,1134,1136],{"className":52,"code":1135,"language":54,"meta":55,"style":55},"target_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    lib1_src_lib\n    lib2_src_lib\n)\n",[20,1137,1138,1146,1150,1154,1158],{"__ignoreMap":55},[59,1139,1140,1142,1144],{"class":61,"line":62},[59,1141,101],{"class":65},[59,1143,70],{"class":69},[59,1145,73],{"class":65},[59,1147,1148],{"class":61,"line":76},[59,1149,112],{"class":111},[59,1151,1152],{"class":61,"line":85},[59,1153,205],{"class":69},[59,1155,1156],{"class":61,"line":91},[59,1157,175],{"class":69},[59,1159,1160],{"class":61,"line":98},[59,1161,88],{"class":69},[10,1163,1164],{},"作用：讓主程序鏈接模板中的兩個示例庫。",[10,1166,1167,1168,1171],{},"當前 ",[20,1169,1170],{},"main.cpp"," 只直接調用：",[50,1173,1175],{"className":672,"code":1174,"language":674,"meta":55,"style":55},"lib1::run_eigen_vector_example();\n",[20,1176,1177],{"__ignoreMap":55},[59,1178,1179,1181,1183,1185],{"class":61,"line":62},[59,1180,38],{"class":111},[59,1182,712],{"class":69},[59,1184,715],{"class":111},[59,1186,718],{"class":69},[10,1188,366,1189,1192],{},[20,1190,1191],{},"lib1::run_eigen_vector_example()"," 內部又會調用：",[50,1194,1196],{"className":672,"code":1195,"language":674,"meta":55,"style":55},"lib2::run_eigen_matrix_example();\n",[20,1197,1198],{"__ignoreMap":55},[59,1199,1200,1202,1204,1206],{"class":61,"line":62},[59,1201,661],{"class":111},[59,1203,712],{"class":69},[59,1205,953],{"class":111},[59,1207,718],{"class":69},[10,1209,1210],{},"所以這個模板的實際調用路徑是：",[50,1212,1215],{"className":1213,"code":1214,"language":398,"meta":55},[396],"main.cpp -> lib1 -> lib2\n",[20,1216,1214],{"__ignoreMap":55},[10,1218,1219],{},"函數實現位於：",[50,1221,1224],{"className":1222,"code":1223,"language":398,"meta":55},[396],"src\u002Flib1\u002Fsrc\u002Feigen3_test.cpp\nsrc\u002Flib2\u002Fsrc\u002Feigen3_test.cpp\n",[20,1225,1223],{"__ignoreMap":55},[10,1227,1228],{},"它們分別被編譯進：",[50,1230,1232],{"className":1231,"code":563,"language":398,"meta":55},[396],[20,1233,563],{"__ignoreMap":55},[10,1235,1236,1237,1239,1240,1242,1243,557],{},"所以主程序至少需要鏈接 ",[20,1238,978],{},"，而 ",[20,1241,978],{}," 又需要鏈接 ",[20,1244,982],{},[10,1246,1247,1248,499,1250,1252,1253,1255,1256,1258,1259,1261,1262,1265,1266,557],{},"本模板這裏仍然讓主程序同時鏈接 ",[20,1249,978],{},[20,1251,982],{},"，是爲了保留\"主程序掛載兩個示例庫\"的直觀結構。實際項目中，如果 ",[20,1254,1170],{}," 完全不直接調用 ",[20,1257,661],{},"，也可以只讓主程序鏈接 ",[20,1260,978],{},"，由 ",[20,1263,1264],{},"lib1 -> lib2"," 這條依賴關係帶出 ",[20,1267,661],{},[41,1269,1271],{"id":1270},"install_rpath",[20,1272,1273],{},"INSTALL_RPATH",[50,1275,1277],{"className":52,"code":1276,"language":54,"meta":55,"style":55},"set_target_properties(${PROJECT_NAME} PROPERTIES\n  INSTALL_RPATH \"$ORIGIN\u002F..\u002F${CMAKE_INSTALL_LIBDIR}\"\n)\n",[20,1278,1279,1289,1295],{"__ignoreMap":55},[59,1280,1281,1283,1285,1287],{"class":61,"line":62},[59,1282,226],{"class":65},[59,1284,70],{"class":69},[59,1286,231],{"class":65},[59,1288,234],{"class":69},[59,1290,1291,1293],{"class":61,"line":76},[59,1292,241],{"class":240},[59,1294,245],{"class":244},[59,1296,1297],{"class":61,"line":85},[59,1298,88],{"class":69},[10,1300,1301],{},"作用：設置安裝後的可執行文件運行時如何找到動態庫。",[10,1303,1304],{},"本模板的庫安裝到：",[50,1306,1309],{"className":1307,"code":1308,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Flib64\u002F\n",[20,1310,1308],{"__ignoreMap":55},[10,1312,1313],{},"可執行文件安裝到：",[50,1315,1318],{"className":1316,"code":1317,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Fbin\u002F\n",[20,1319,1317],{"__ignoreMap":55},[10,1321,1322],{},"運行：",[50,1324,1328],{"className":1325,"code":1326,"language":1327,"meta":55,"style":55},"language-bash shiki shiki-themes github-light github-dark",".\u002Finstall\u002Flinux-debug\u002Fbin\u002Fcmake_template\n","bash",[20,1329,1330],{"__ignoreMap":55},[59,1331,1332],{"class":61,"line":62},[59,1333,1326],{"class":111},[10,1335,1336],{},"程序需要找到：",[50,1338,1341],{"className":1339,"code":1340,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Flib64\u002Fliblib1_src_lib.so\ninstall\u002Flinux-debug\u002Flib64\u002Fliblib2_src_lib.so\n",[20,1342,1340],{"__ignoreMap":55},[10,1344,1345,1348],{},[20,1346,1347],{},"$ORIGIN"," 表示可執行文件所在目錄，也就是：",[50,1350,1353],{"className":1351,"code":1352,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Fbin\n",[20,1354,1352],{"__ignoreMap":55},[10,1356,441],{},[50,1358,1361],{"className":1359,"code":1360,"language":398,"meta":55},[396],"$ORIGIN\u002F..\u002Flib64\n",[20,1362,1360],{"__ignoreMap":55},[10,1364,454],{},[50,1366,1369],{"className":1367,"code":1368,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Flib64\n",[20,1370,1368],{"__ignoreMap":55},[10,1372,1373,1374,1377,1378,1381,1382,557],{},"其中 ",[20,1375,1376],{},"${CMAKE_INSTALL_LIBDIR}"," 可能是 ",[20,1379,1380],{},"lib","，也可能是 ",[20,1383,1384],{},"lib64",[10,1386,1387],{},"常見可填值：",[1389,1390,1391,1405],"table",{},[1392,1393,1394],"thead",{},[1395,1396,1397,1402],"tr",{},[1398,1399,1401],"th",{"align":1400},"left","寫法",[1398,1403,1404],{"align":1400},"說明",[1406,1407,1408,1419,1429],"tbody",{},[1395,1409,1410,1416],{},[1411,1412,1413],"td",{"align":1400},[20,1414,1415],{},"\"$ORIGIN\u002F..\u002F${CMAKE_INSTALL_LIBDIR}\"",[1411,1417,1418],{"align":1400},"推薦，安裝後相對查找庫",[1395,1420,1421,1426],{},[1411,1422,1423],{"align":1400},[20,1424,1425],{},"\"\u002Fusr\u002Flocal\u002Flib\"",[1411,1427,1428],{"align":1400},"寫死系統路徑，不適合模板",[1395,1430,1431,1436],{},[1411,1432,1433],{"align":1400},[20,1434,1435],{},"\"\"",[1411,1437,1438,1439],{"align":1400},"不設置 RPATH，需要依賴系統庫路徑或 ",[20,1440,1441],{},"LD_LIBRARY_PATH",[10,1443,1444,1445,1448],{},"因爲本模板已經設置 RPATH，所以不需要舊腳本去 ",[20,1446,1447],{},"source"," 環境變量。",[41,1450,1451],{"id":1451},"安裝主程序",[50,1453,1455],{"className":52,"code":1454,"language":54,"meta":55,"style":55},"install(TARGETS ${PROJECT_NAME}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n",[20,1456,1457,1465,1471],{"__ignoreMap":55},[59,1458,1459,1461,1463],{"class":61,"line":62},[59,1460,261],{"class":65},[59,1462,264],{"class":69},[59,1464,73],{"class":65},[59,1466,1467,1469],{"class":61,"line":76},[59,1468,272],{"class":69},[59,1470,275],{"class":65},[59,1472,1473],{"class":61,"line":85},[59,1474,88],{"class":69},[10,1476,1477],{},"作用：安裝可執行文件。",[10,1479,1480,1483],{},[20,1481,1482],{},"install(TARGETS ...)"," 常見分類：",[1389,1485,1486,1499],{},[1392,1487,1488],{},[1395,1489,1490,1493,1496],{},[1398,1491,1492],{"align":1400},"類型",[1398,1494,1495],{"align":1400},"對應產物",[1398,1497,1498],{"align":1400},"常用安裝目錄",[1406,1500,1501,1516,1533],{},[1395,1502,1503,1508,1511],{},[1411,1504,1505],{"align":1400},[20,1506,1507],{},"RUNTIME",[1411,1509,1510],{"align":1400},"可執行文件，Windows DLL",[1411,1512,1513],{"align":1400},[20,1514,1515],{},"${CMAKE_INSTALL_BINDIR}",[1395,1517,1518,1523,1529],{},[1411,1519,1520],{"align":1400},[20,1521,1522],{},"LIBRARY",[1411,1524,1525,1526],{"align":1400},"Linux 動態庫 ",[20,1527,1528],{},".so",[1411,1530,1531],{"align":1400},[20,1532,1376],{},[1395,1534,1535,1540,1546],{},[1411,1536,1537],{"align":1400},[20,1538,1539],{},"ARCHIVE",[1411,1541,1542,1543],{"align":1400},"靜態庫 ",[20,1544,1545],{},".a",[1411,1547,1548],{"align":1400},[20,1549,1376],{},[10,1551,1552],{},"主程序是可執行文件，所以使用：",[50,1554,1556],{"className":52,"code":1555,"language":54,"meta":55,"style":55},"RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n",[20,1557,1558],{"__ignoreMap":55},[59,1559,1560,1563],{"class":61,"line":62},[59,1561,1562],{"class":69},"RUNTIME DESTINATION ",[59,1564,275],{"class":65},[10,1566,1567],{},"安裝後路徑通常是：",[50,1569,1572],{"className":1570,"code":1571,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Fbin\u002Fcmake_template\n",[20,1573,1571],{"__ignoreMap":55},[41,1575,1577],{"id":1576},"lib1-的-cmakelists","lib1 的 CMakeLists",[10,1579,1580,669],{},[20,1581,28],{},[50,1583,1585],{"className":52,"code":1584,"language":54,"meta":55,"style":55},"set(PREFIX \"lib1\")\n\nfile(GLOB_RECURSE ${PREFIX}_SRC_LIST CONFIGURE_DEPENDS\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.c\"\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n)\n\nadd_library(${PREFIX}_src_lib SHARED\n  ${${PREFIX}_SRC_LIST}\n)\n\ntarget_include_directories(${PREFIX}_src_lib\n  PUBLIC\n    $\u003CBUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}\u002Finc>\n    $\u003CINSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n)\n\ntarget_link_libraries(${PREFIX}_src_lib\n  PUBLIC\n    project_options\n  PRIVATE\n    project_warnings\n)\n\n# ========================\n# Third-party dependencies\n# ========================\nfind_package(Eigen3 REQUIRED)\n\ntarget_link_libraries(${PREFIX}_src_lib\n  PUBLIC\n    Eigen3::Eigen\n)\n\n# =======\n# Install\n# =======\ninstall(TARGETS ${PREFIX}_src_lib\n  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\n  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n)\n\ninstall(DIRECTORY \"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n)\n",[20,1586,1587,1602,1606,1620,1625,1630,1634,1638,1650,1660,1664,1668,1680,1684,1695,1706,1710,1714,1724,1728,1732,1736,1740,1744,1748,1753,1758,1762,1770,1774,1784,1788,1794,1799,1804,1810,1816,1821,1832,1841,1849,1856,1861,1866,1877,1886],{"__ignoreMap":55},[59,1588,1589,1592,1594,1597,1600],{"class":61,"line":62},[59,1590,1591],{"class":65},"set",[59,1593,70],{"class":69},[59,1595,1596],{"class":111},"PREFIX",[59,1598,1599],{"class":244}," \"lib1\"",[59,1601,88],{"class":69},[59,1603,1604],{"class":61,"line":76},[59,1605,95],{"emptyLinePlaceholder":94},[59,1607,1608,1611,1614,1617],{"class":61,"line":85},[59,1609,1610],{"class":65},"file",[59,1612,1613],{"class":69},"(GLOB_RECURSE ",[59,1615,1616],{"class":65},"${PREFIX}",[59,1618,1619],{"class":69},"_SRC_LIST CONFIGURE_DEPENDS\n",[59,1621,1622],{"class":61,"line":91},[59,1623,1624],{"class":244},"  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.c\"\n",[59,1626,1627],{"class":61,"line":98},[59,1628,1629],{"class":244},"  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n",[59,1631,1632],{"class":61,"line":108},[59,1633,88],{"class":69},[59,1635,1636],{"class":61,"line":115},[59,1637,95],{"emptyLinePlaceholder":94},[59,1639,1640,1643,1645,1647],{"class":61,"line":121},[59,1641,1642],{"class":65},"add_library",[59,1644,70],{"class":69},[59,1646,1616],{"class":65},[59,1648,1649],{"class":69},"_src_lib SHARED\n",[59,1651,1652,1655,1657],{"class":61,"line":127},[59,1653,1654],{"class":69},"  ${",[59,1656,1616],{"class":65},[59,1658,1659],{"class":69},"_SRC_LIST}\n",[59,1661,1662],{"class":61,"line":132},[59,1663,88],{"class":69},[59,1665,1666],{"class":61,"line":137},[59,1667,95],{"emptyLinePlaceholder":94},[59,1669,1670,1673,1675,1677],{"class":61,"line":146},[59,1671,1672],{"class":65},"target_include_directories",[59,1674,70],{"class":69},[59,1676,1616],{"class":65},[59,1678,1679],{"class":69},"_src_lib\n",[59,1681,1682],{"class":61,"line":154},[59,1683,1098],{"class":111},[59,1685,1686,1689,1692],{"class":61,"line":159},[59,1687,1688],{"class":69},"    $\u003CBUILD_INTERFACE:",[59,1690,1691],{"class":65},"${CMAKE_CURRENT_LIST_DIR}",[59,1693,1694],{"class":69},"\u002Finc>\n",[59,1696,1697,1700,1703],{"class":61,"line":167},[59,1698,1699],{"class":69},"    $\u003CINSTALL_INTERFACE:",[59,1701,1702],{"class":65},"${CMAKE_INSTALL_INCLUDEDIR}",[59,1704,1705],{"class":69},">\n",[59,1707,1708],{"class":61,"line":172},[59,1709,88],{"class":69},[59,1711,1712],{"class":61,"line":178},[59,1713,95],{"emptyLinePlaceholder":94},[59,1715,1716,1718,1720,1722],{"class":61,"line":183},[59,1717,101],{"class":65},[59,1719,70],{"class":69},[59,1721,1616],{"class":65},[59,1723,1679],{"class":69},[59,1725,1726],{"class":61,"line":188},[59,1727,1098],{"class":111},[59,1729,1730],{"class":61,"line":197},[59,1731,118],{"class":69},[59,1733,1734],{"class":61,"line":202},[59,1735,112],{"class":111},[59,1737,1738],{"class":61,"line":208},[59,1739,124],{"class":69},[59,1741,1742],{"class":61,"line":213},[59,1743,88],{"class":69},[59,1745,1746],{"class":61,"line":218},[59,1747,95],{"emptyLinePlaceholder":94},[59,1749,1750],{"class":61,"line":223},[59,1751,1752],{"class":971},"# ========================\n",[59,1754,1755],{"class":61,"line":237},[59,1756,1757],{"class":971},"# Third-party dependencies\n",[59,1759,1760],{"class":61,"line":248},[59,1761,1752],{"class":971},[59,1763,1764,1767],{"class":61,"line":253},[59,1765,1766],{"class":65},"find_package",[59,1768,1769],{"class":69},"(Eigen3 REQUIRED)\n",[59,1771,1772],{"class":61,"line":258},[59,1773,95],{"emptyLinePlaceholder":94},[59,1775,1776,1778,1780,1782],{"class":61,"line":269},[59,1777,101],{"class":65},[59,1779,70],{"class":69},[59,1781,1616],{"class":65},[59,1783,1679],{"class":69},[59,1785,1786],{"class":61,"line":278},[59,1787,1098],{"class":111},[59,1789,1791],{"class":61,"line":1790},32,[59,1792,1793],{"class":69},"    Eigen3::Eigen\n",[59,1795,1797],{"class":61,"line":1796},33,[59,1798,88],{"class":69},[59,1800,1802],{"class":61,"line":1801},34,[59,1803,95],{"emptyLinePlaceholder":94},[59,1805,1807],{"class":61,"line":1806},35,[59,1808,1809],{"class":971},"# =======\n",[59,1811,1813],{"class":61,"line":1812},36,[59,1814,1815],{"class":971},"# Install\n",[59,1817,1819],{"class":61,"line":1818},37,[59,1820,1809],{"class":971},[59,1822,1824,1826,1828,1830],{"class":61,"line":1823},38,[59,1825,261],{"class":65},[59,1827,264],{"class":69},[59,1829,1616],{"class":65},[59,1831,1679],{"class":69},[59,1833,1835,1838],{"class":61,"line":1834},39,[59,1836,1837],{"class":69},"  LIBRARY DESTINATION ",[59,1839,1840],{"class":65},"${CMAKE_INSTALL_LIBDIR}\n",[59,1842,1844,1847],{"class":61,"line":1843},40,[59,1845,1846],{"class":69},"  ARCHIVE DESTINATION ",[59,1848,1840],{"class":65},[59,1850,1852,1854],{"class":61,"line":1851},41,[59,1853,272],{"class":69},[59,1855,275],{"class":65},[59,1857,1859],{"class":61,"line":1858},42,[59,1860,88],{"class":69},[59,1862,1864],{"class":61,"line":1863},43,[59,1865,95],{"emptyLinePlaceholder":94},[59,1867,1869,1871,1874],{"class":61,"line":1868},44,[59,1870,261],{"class":65},[59,1872,1873],{"class":69},"(DIRECTORY ",[59,1875,1876],{"class":244},"\"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n",[59,1878,1880,1883],{"class":61,"line":1879},45,[59,1881,1882],{"class":69},"  DESTINATION ",[59,1884,1885],{"class":65},"${CMAKE_INSTALL_INCLUDEDIR}\n",[59,1887,1889],{"class":61,"line":1888},46,[59,1890,88],{"class":69},[41,1892,1894],{"id":1893},"setprefix-lib1",[20,1895,1896],{},"set(PREFIX \"lib1\")",[50,1898,1900],{"className":52,"code":1899,"language":54,"meta":55,"style":55},"set(PREFIX \"lib1\")\n",[20,1901,1902],{"__ignoreMap":55},[59,1903,1904,1906,1908,1910,1912],{"class":61,"line":62},[59,1905,1591],{"class":65},[59,1907,70],{"class":69},[59,1909,1596],{"class":111},[59,1911,1599],{"class":244},[59,1913,88],{"class":69},[10,1915,1916],{},"作用：設置一個局部變量，方便複用。",[10,1918,1919,1920,1922],{},"後面這些名字都會由 ",[20,1921,1596],{}," 生成：",[1389,1924,1925,1935],{},[1392,1926,1927],{},[1395,1928,1929,1932],{},[1398,1930,1931],{"align":1400},"表達式",[1398,1933,1934],{"align":1400},"展開後",[1406,1936,1937,1949],{},[1395,1938,1939,1944],{},[1411,1940,1941],{"align":1400},[20,1942,1943],{},"${PREFIX}_SRC_LIST",[1411,1945,1946],{"align":1400},[20,1947,1948],{},"lib1_SRC_LIST",[1395,1950,1951,1956],{},[1411,1952,1953],{"align":1400},[20,1954,1955],{},"${PREFIX}_src_lib",[1411,1957,1958],{"align":1400},[20,1959,978],{},[10,1961,1962,1963,1966],{},"如果複製這個文件給 ",[20,1964,1965],{},"lib3","，只需要改：",[50,1968,1970],{"className":52,"code":1969,"language":54,"meta":55,"style":55},"set(PREFIX \"lib3\")\n",[20,1971,1972],{"__ignoreMap":55},[59,1973,1974,1976,1978,1980,1983],{"class":61,"line":62},[59,1975,1591],{"class":65},[59,1977,70],{"class":69},[59,1979,1596],{"class":111},[59,1981,1982],{"class":244}," \"lib3\"",[59,1984,88],{"class":69},[10,1986,1987],{},"target 名就會變成：",[50,1989,1992],{"className":1990,"code":1991,"language":398,"meta":55},[396],"lib3_src_lib\n",[20,1993,1991],{"__ignoreMap":55},[10,1995,1996,1997,499,1999,2001,2002,2005,2006,2009,2010,557],{},"注意：target 名不能重名。",[20,1998,38],{},[20,2000,661],{}," 的 ",[20,2003,2004],{},".cpp"," 文件可以都叫 ",[20,2007,2008],{},"eigen3_test.cpp","，但 CMake target 不能都叫 ",[20,2011,2012],{},"src_lib",[41,2014,2016],{"id":2015},"fileglob_recurse",[20,2017,2018],{},"file(GLOB_RECURSE ...)",[50,2020,2022],{"className":52,"code":2021,"language":54,"meta":55,"style":55},"file(GLOB_RECURSE ${PREFIX}_SRC_LIST CONFIGURE_DEPENDS\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.c\"\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n)\n",[20,2023,2024,2034,2038,2042],{"__ignoreMap":55},[59,2025,2026,2028,2030,2032],{"class":61,"line":62},[59,2027,1610],{"class":65},[59,2029,1613],{"class":69},[59,2031,1616],{"class":65},[59,2033,1619],{"class":69},[59,2035,2036],{"class":61,"line":76},[59,2037,1624],{"class":244},[59,2039,2040],{"class":61,"line":85},[59,2041,1629],{"class":244},[59,2043,2044],{"class":61,"line":91},[59,2045,88],{"class":69},[10,2047,2048],{},"作用：收集源碼文件。",[10,2050,2051],{},"參數解釋：",[1389,2053,2054,2064],{},[1392,2055,2056],{},[1395,2057,2058,2061],{},[1398,2059,2060],{"align":1400},"參數",[1398,2062,2063],{"align":1400},"作用",[1406,2065,2066,2076,2085,2095,2105],{},[1395,2067,2068,2073],{},[1411,2069,2070],{"align":1400},[20,2071,2072],{},"GLOB_RECURSE",[1411,2074,2075],{"align":1400},"遞歸查找子目錄",[1395,2077,2078,2082],{},[1411,2079,2080],{"align":1400},[20,2081,1943],{},[1411,2083,2084],{"align":1400},"保存結果的變量名",[1395,2086,2087,2092],{},[1411,2088,2089],{"align":1400},[20,2090,2091],{},"CONFIGURE_DEPENDS",[1411,2093,2094],{"align":1400},"源文件列表變化時，觸發 CMake 重新配置",[1395,2096,2097,2102],{},[1411,2098,2099],{"align":1400},[20,2100,2101],{},"\"src\u002F*.c\"",[1411,2103,2104],{"align":1400},"匹配 C 文件",[1395,2106,2107,2112],{},[1411,2108,2109],{"align":1400},[20,2110,2111],{},"\"src\u002F*.cpp\"",[1411,2113,2114],{"align":1400},"匹配 C++ 文件",[10,2116,2117],{},"可以填什麼：",[50,2119,2121],{"className":52,"code":2120,"language":54,"meta":55,"style":55},"file(GLOB_RECURSE MY_SOURCES CONFIGURE_DEPENDS\n  \"${CMAKE_CURRENT_LIST_DIR}\u002Fsrc\u002F*.cpp\"\n)\n",[20,2122,2123,2130,2134],{"__ignoreMap":55},[59,2124,2125,2127],{"class":61,"line":62},[59,2126,1610],{"class":65},[59,2128,2129],{"class":69},"(GLOB_RECURSE MY_SOURCES CONFIGURE_DEPENDS\n",[59,2131,2132],{"class":61,"line":76},[59,2133,1629],{"class":244},[59,2135,2136],{"class":61,"line":85},[59,2137,88],{"class":69},[10,2139,2140,2141,2143],{},"也可以不用 ",[20,2142,2072],{},"，手動列文件：",[50,2145,2147],{"className":52,"code":2146,"language":54,"meta":55,"style":55},"set(lib1_SRC_LIST\n  src\u002Feigen3_test.cpp\n)\n",[20,2148,2149,2156,2161],{"__ignoreMap":55},[59,2150,2151,2153],{"class":61,"line":62},[59,2152,1591],{"class":65},[59,2154,2155],{"class":69},"(lib1_SRC_LIST\n",[59,2157,2158],{"class":61,"line":76},[59,2159,2160],{"class":69},"  src\u002Feigen3_test.cpp\n",[59,2162,2163],{"class":61,"line":85},[59,2164,88],{"class":69},[10,2166,2167],{},"兩種方式對比：",[1389,2169,2170,2182],{},[1392,2171,2172],{},[1395,2173,2174,2176,2179],{},[1398,2175,1401],{"align":1400},[1398,2177,2178],{"align":1400},"優點",[1398,2180,2181],{"align":1400},"缺點",[1406,2183,2184,2195],{},[1395,2185,2186,2189,2192],{},[1411,2187,2188],{"align":1400},"手動列文件",[1411,2190,2191],{"align":1400},"明確、可控",[1411,2193,2194],{"align":1400},"新增文件要手動改 CMake",[1395,2196,2197,2201,2204],{},[1411,2198,2199],{"align":1400},[20,2200,2072],{},[1411,2202,2203],{"align":1400},"模板方便，新增文件自動收集",[1411,2205,2206],{"align":1400},"文件列表不如手寫直觀",[10,2208,2209,2210,557],{},"本模板爲了易用，使用 ",[20,2211,2212],{},"GLOB_RECURSE CONFIGURE_DEPENDS",[41,2214,2215],{"id":2215},"雙層變量展開",[50,2217,2219],{"className":52,"code":2218,"language":54,"meta":55,"style":55},"add_library(${PREFIX}_src_lib SHARED\n  ${${PREFIX}_SRC_LIST}\n)\n",[20,2220,2221,2231,2239],{"__ignoreMap":55},[59,2222,2223,2225,2227,2229],{"class":61,"line":62},[59,2224,1642],{"class":65},[59,2226,70],{"class":69},[59,2228,1616],{"class":65},[59,2230,1649],{"class":69},[59,2232,2233,2235,2237],{"class":61,"line":76},[59,2234,1654],{"class":69},[59,2236,1616],{"class":65},[59,2238,1659],{"class":69},[59,2240,2241],{"class":61,"line":85},[59,2242,88],{"class":69},[10,2244,2245],{},"這裏有一個容易困惑的寫法：",[50,2247,2249],{"className":52,"code":2248,"language":54,"meta":55,"style":55},"${${PREFIX}_SRC_LIST}\n",[20,2250,2251],{"__ignoreMap":55},[59,2252,2253,2256,2258],{"class":61,"line":62},[59,2254,2255],{"class":69},"${",[59,2257,1616],{"class":65},[59,2259,1659],{"class":69},[10,2261,2262],{},"如果：",[50,2264,2266],{"className":52,"code":2265,"language":54,"meta":55,"style":55},"PREFIX = lib1\n",[20,2267,2268],{"__ignoreMap":55},[59,2269,2270,2272],{"class":61,"line":62},[59,2271,1596],{"class":111},[59,2273,2274],{"class":69}," = lib1\n",[10,2276,2277],{},"那麼：",[50,2279,2281],{"className":52,"code":2280,"language":54,"meta":55,"style":55},"${PREFIX}_SRC_LIST\n",[20,2282,2283],{"__ignoreMap":55},[59,2284,2285,2287],{"class":61,"line":62},[59,2286,1616],{"class":65},[59,2288,2289],{"class":69},"_SRC_LIST\n",[10,2291,2292],{},"先變成：",[50,2294,2297],{"className":2295,"code":2296,"language":398,"meta":55},[396],"lib1_SRC_LIST\n",[20,2298,2296],{"__ignoreMap":55},[10,2300,2301],{},"再取變量：",[50,2303,2305],{"className":52,"code":2304,"language":54,"meta":55,"style":55},"${lib1_SRC_LIST}\n",[20,2306,2307],{"__ignoreMap":55},[59,2308,2309],{"class":61,"line":62},[59,2310,2304],{"class":65},[10,2312,2313],{},"最終得到源碼文件列表。",[41,2315,2316],{"id":1642},[20,2317,1642],{},[50,2319,2320],{"className":52,"code":2218,"language":54,"meta":55,"style":55},[20,2321,2322,2332,2340],{"__ignoreMap":55},[59,2323,2324,2326,2328,2330],{"class":61,"line":62},[59,2325,1642],{"class":65},[59,2327,70],{"class":69},[59,2329,1616],{"class":65},[59,2331,1649],{"class":69},[59,2333,2334,2336,2338],{"class":61,"line":76},[59,2335,1654],{"class":69},[59,2337,1616],{"class":65},[59,2339,1659],{"class":69},[59,2341,2342],{"class":61,"line":85},[59,2343,88],{"class":69},[10,2345,2346],{},"作用：創建庫 target。",[10,2348,2349],{},"常見類型：",[1389,2351,2352,2363],{},[1392,2353,2354],{},[1395,2355,2356,2358,2361],{},[1398,2357,1492],{"align":1400},[1398,2359,2360],{"align":1400},"產物",[1398,2362,1404],{"align":1400},[1406,2364,2365,2379,2393,2407,2422],{},[1395,2366,2367,2372,2376],{},[1411,2368,2369],{"align":1400},[20,2370,2371],{},"SHARED",[1411,2373,2374],{"align":1400},[20,2375,1528],{},[1411,2377,2378],{"align":1400},"動態庫，本模板使用",[1395,2380,2381,2386,2390],{},[1411,2382,2383],{"align":1400},[20,2384,2385],{},"STATIC",[1411,2387,2388],{"align":1400},[20,2389,1545],{},[1411,2391,2392],{"align":1400},"靜態庫",[1395,2394,2395,2400,2404],{},[1411,2396,2397],{"align":1400},[20,2398,2399],{},"MODULE",[1411,2401,2402],{"align":1400},[20,2403,1528],{},[1411,2405,2406],{"align":1400},"插件模塊，不用於普通鏈接",[1395,2408,2409,2414,2419],{},[1411,2410,2411],{"align":1400},[20,2412,2413],{},"OBJECT",[1411,2415,2416],{"align":1400},[20,2417,2418],{},".o",[1411,2420,2421],{"align":1400},"對象庫",[1395,2423,2424,2427,2434],{},[1411,2425,2426],{"align":1400},"不寫",[1411,2428,2429,2430,2433],{"align":1400},"由 ",[20,2431,2432],{},"BUILD_SHARED_LIBS"," 決定",[1411,2435],{"align":1400},[10,2437,2438],{},"如果想改成靜態庫：",[50,2440,2442],{"className":52,"code":2441,"language":54,"meta":55,"style":55},"add_library(${PREFIX}_src_lib STATIC\n  ${${PREFIX}_SRC_LIST}\n)\n",[20,2443,2444,2455,2463],{"__ignoreMap":55},[59,2445,2446,2448,2450,2452],{"class":61,"line":62},[59,2447,1642],{"class":65},[59,2449,70],{"class":69},[59,2451,1616],{"class":65},[59,2453,2454],{"class":69},"_src_lib STATIC\n",[59,2456,2457,2459,2461],{"class":61,"line":76},[59,2458,1654],{"class":69},[59,2460,1616],{"class":65},[59,2462,1659],{"class":69},[59,2464,2465],{"class":61,"line":85},[59,2466,88],{"class":69},[10,2468,2469],{},"如果希望用戶用 preset 控制靜態或動態，可以寫：",[50,2471,2473],{"className":52,"code":2472,"language":54,"meta":55,"style":55},"add_library(${PREFIX}_src_lib\n  ${${PREFIX}_SRC_LIST}\n)\n",[20,2474,2475,2485,2493],{"__ignoreMap":55},[59,2476,2477,2479,2481,2483],{"class":61,"line":62},[59,2478,1642],{"class":65},[59,2480,70],{"class":69},[59,2482,1616],{"class":65},[59,2484,1679],{"class":69},[59,2486,2487,2489,2491],{"class":61,"line":76},[59,2488,1654],{"class":69},[59,2490,1616],{"class":65},[59,2492,1659],{"class":69},[59,2494,2495],{"class":61,"line":85},[59,2496,88],{"class":69},[10,2498,2499],{},"然後在 preset 中設置：",[50,2501,2505],{"className":2502,"code":2503,"language":2504,"meta":55,"style":55},"language-json shiki shiki-themes github-light github-dark","\"BUILD_SHARED_LIBS\": \"ON\"\n","json",[20,2506,2507],{"__ignoreMap":55},[59,2508,2509,2512,2515],{"class":61,"line":62},[59,2510,2511],{"class":244},"\"BUILD_SHARED_LIBS\"",[59,2513,2514],{"class":69},": ",[59,2516,2517],{"class":244},"\"ON\"\n",[41,2519,2520],{"id":1672},[20,2521,1672],{},[50,2523,2525],{"className":52,"code":2524,"language":54,"meta":55,"style":55},"target_include_directories(${PREFIX}_src_lib\n  PUBLIC\n    $\u003CBUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}\u002Finc>\n    $\u003CINSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n)\n",[20,2526,2527,2537,2541,2549,2557],{"__ignoreMap":55},[59,2528,2529,2531,2533,2535],{"class":61,"line":62},[59,2530,1672],{"class":65},[59,2532,70],{"class":69},[59,2534,1616],{"class":65},[59,2536,1679],{"class":69},[59,2538,2539],{"class":61,"line":76},[59,2540,1098],{"class":111},[59,2542,2543,2545,2547],{"class":61,"line":85},[59,2544,1688],{"class":69},[59,2546,1691],{"class":65},[59,2548,1694],{"class":69},[59,2550,2551,2553,2555],{"class":61,"line":91},[59,2552,1699],{"class":69},[59,2554,1702],{"class":65},[59,2556,1705],{"class":69},[59,2558,2559],{"class":61,"line":98},[59,2560,88],{"class":69},[10,2562,2563],{},"作用：告訴編譯器頭文件在哪裏。",[10,2565,2566,2567,2569],{},"這裏使用 ",[20,2568,1082],{},"，因爲：",[14,2571,2572,2577],{},[17,2573,2574,2576],{},[20,2575,38],{}," 自己編譯時需要找到自己的頭文件。",[17,2578,2579,2580,2582,2583,557],{},"鏈接 ",[20,2581,978],{}," 的主程序也需要找到 ",[20,2584,2585],{},"lib1\u002Feigen3_test.hpp",[402,2587,2589],{"id":2588},"build_interface",[20,2590,2591],{},"BUILD_INTERFACE",[50,2593,2595],{"className":52,"code":2594,"language":54,"meta":55,"style":55},"$\u003CBUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}\u002Finc>\n",[20,2596,2597],{"__ignoreMap":55},[59,2598,2599,2602,2604],{"class":61,"line":62},[59,2600,2601],{"class":69},"$\u003CBUILD_INTERFACE:",[59,2603,1691],{"class":65},[59,2605,1694],{"class":69},[10,2607,2608],{},"表示在源碼構建階段，include 路徑是：",[50,2610,2613],{"className":2611,"code":2612,"language":398,"meta":55},[396],"src\u002Flib1\u002Finc\n",[20,2614,2612],{"__ignoreMap":55},[10,2616,2617],{},"所以源碼裏可以寫：",[50,2619,2621],{"className":672,"code":2620,"language":674,"meta":55,"style":55},"#include \"lib1\u002Feigen3_test.hpp\"\n",[20,2622,2623],{"__ignoreMap":55},[59,2624,2625,2627],{"class":61,"line":62},[59,2626,681],{"class":65},[59,2628,684],{"class":244},[10,2630,2631],{},"對應真實文件：",[50,2633,2636],{"className":2634,"code":2635,"language":398,"meta":55},[396],"src\u002Flib1\u002Finc\u002Flib1\u002Feigen3_test.hpp\n",[20,2637,2635],{"__ignoreMap":55},[402,2639,2641],{"id":2640},"install_interface",[20,2642,2643],{},"INSTALL_INTERFACE",[50,2645,2647],{"className":52,"code":2646,"language":54,"meta":55,"style":55},"$\u003CINSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>\n",[20,2648,2649],{"__ignoreMap":55},[59,2650,2651,2654,2656],{"class":61,"line":62},[59,2652,2653],{"class":69},"$\u003CINSTALL_INTERFACE:",[59,2655,1702],{"class":65},[59,2657,1705],{"class":69},[10,2659,2660],{},"表示安裝後的 include 路徑是：",[50,2662,2665],{"className":2663,"code":2664,"language":398,"meta":55},[396],"include\n",[20,2666,2664],{"__ignoreMap":55},[10,2668,2669],{},"安裝後頭文件路徑：",[50,2671,2674],{"className":2672,"code":2673,"language":398,"meta":55},[396],"install\u002Flinux-debug\u002Finclude\u002Flib1\u002Feigen3_test.hpp\n",[20,2675,2673],{"__ignoreMap":55},[10,2677,2678],{},"下游仍然可以寫：",[50,2680,2681],{"className":672,"code":2620,"language":674,"meta":55,"style":55},[20,2682,2683],{"__ignoreMap":55},[59,2684,2685,2687],{"class":61,"line":62},[59,2686,681],{"class":65},[59,2688,684],{"class":244},[402,2690,2692,2693],{"id":2691},"爲什麼頭文件放-inclib1","爲什麼頭文件放 ",[20,2694,2695],{},"inc\u002Flib1\u002F",[10,2697,2698],{},"如果兩個庫都把頭文件放成：",[50,2700,2703],{"className":2701,"code":2702,"language":398,"meta":55},[396],"inc\u002Feigen3_test.hpp\n",[20,2704,2702],{"__ignoreMap":55},[10,2706,2707],{},"主程序寫：",[50,2709,2711],{"className":672,"code":2710,"language":674,"meta":55,"style":55},"#include \"eigen3_test.hpp\"\n",[20,2712,2713],{"__ignoreMap":55},[59,2714,2715,2717],{"class":61,"line":62},[59,2716,681],{"class":65},[59,2718,2719],{"class":244}," \"eigen3_test.hpp\"\n",[10,2721,2722,2723,2725,2726,557],{},"就會分不清到底來自 ",[20,2724,38],{}," 還是 ",[20,2727,661],{},[10,2729,2730],{},"所以模板使用：",[50,2732,2735],{"className":2733,"code":2734,"language":398,"meta":55},[396],"lib1\u002Finc\u002Flib1\u002Feigen3_test.hpp\nlib2\u002Finc\u002Flib2\u002Feigen3_test.hpp\n",[20,2736,2734],{"__ignoreMap":55},[10,2738,2707],{},[50,2740,2742],{"className":672,"code":2741,"language":674,"meta":55,"style":55},"#include \"lib1\u002Feigen3_test.hpp\"\n#include \"lib2\u002Feigen3_test.hpp\"\n",[20,2743,2744,2750],{"__ignoreMap":55},[59,2745,2746,2748],{"class":61,"line":62},[59,2747,681],{"class":65},[59,2749,684],{"class":244},[59,2751,2752,2754],{"class":61,"line":76},[59,2753,681],{"class":65},[59,2755,782],{"class":244},[10,2757,2758],{},"這是一種很常見的工程寫法。",[41,2760,2762],{"id":2761},"鏈接公共選項和-warning","鏈接公共選項和 warning",[50,2764,2766],{"className":52,"code":2765,"language":54,"meta":55,"style":55},"target_link_libraries(${PREFIX}_src_lib\n  PUBLIC\n    project_options\n  PRIVATE\n    project_warnings\n)\n",[20,2767,2768,2778,2782,2786,2790,2794],{"__ignoreMap":55},[59,2769,2770,2772,2774,2776],{"class":61,"line":62},[59,2771,101],{"class":65},[59,2773,70],{"class":69},[59,2775,1616],{"class":65},[59,2777,1679],{"class":69},[59,2779,2780],{"class":61,"line":76},[59,2781,1098],{"class":111},[59,2783,2784],{"class":61,"line":85},[59,2785,118],{"class":69},[59,2787,2788],{"class":61,"line":91},[59,2789,112],{"class":111},[59,2791,2792],{"class":61,"line":98},[59,2793,124],{"class":69},[59,2795,2796],{"class":61,"line":108},[59,2797,88],{"class":69},[10,2799,2800],{},"含義：",[14,2802,2803,2810],{},[17,2804,2805,2807,2808,557],{},[20,2806,498],{}," 是庫的使用要求，使用 ",[20,2809,1082],{},[17,2811,2812,2814,2815,557],{},[20,2813,502],{}," 只是編譯本庫時使用，使用 ",[20,2816,512],{},[10,2818,2819,2820,2822],{},"爲什麼 warning 不用 ",[20,2821,1082],{},"？",[10,2824,2825,2826,2828,2829,2831],{},"如果庫未來被其他項目使用，",[20,2827,1082],{}," warning 會強迫下游也使用你的 warning 設置。作爲模板，",[20,2830,512],{}," 更溫和。",[41,2833,2835],{"id":2834},"third-party-dependencies",[20,2836,2837],{},"Third-party dependencies",[50,2839,2841],{"className":52,"code":2840,"language":54,"meta":55,"style":55},"# ========================\n# Third-party dependencies\n# ========================\nfind_package(Eigen3 REQUIRED)\n\ntarget_link_libraries(${PREFIX}_src_lib\n  PUBLIC\n    Eigen3::Eigen\n)\n",[20,2842,2843,2847,2851,2855,2861,2865,2875,2879,2883],{"__ignoreMap":55},[59,2844,2845],{"class":61,"line":62},[59,2846,1752],{"class":971},[59,2848,2849],{"class":61,"line":76},[59,2850,1757],{"class":971},[59,2852,2853],{"class":61,"line":85},[59,2854,1752],{"class":971},[59,2856,2857,2859],{"class":61,"line":91},[59,2858,1766],{"class":65},[59,2860,1769],{"class":69},[59,2862,2863],{"class":61,"line":98},[59,2864,95],{"emptyLinePlaceholder":94},[59,2866,2867,2869,2871,2873],{"class":61,"line":108},[59,2868,101],{"class":65},[59,2870,70],{"class":69},[59,2872,1616],{"class":65},[59,2874,1679],{"class":69},[59,2876,2877],{"class":61,"line":115},[59,2878,1098],{"class":111},[59,2880,2881],{"class":61,"line":121},[59,2882,1793],{"class":69},[59,2884,2885],{"class":61,"line":127},[59,2886,88],{"class":69},[10,2888,2889],{},"這個區塊集中寫當前模塊使用的第三方庫。",[10,2891,2892],{},"原則：",[14,2894,2895,2900,2903],{},[17,2896,2897,2898,557],{},"誰用第三方庫，誰 ",[20,2899,1766],{},[17,2901,2902],{},"不把所有第三方庫塞到頂層。",[17,2904,2905],{},"刪除某個依賴時，只看這個區塊就能刪乾淨。",[10,2907,2908,2909,2911,2912,2914,2915,2918],{},"如果 ",[20,2910,38],{}," 用 Eigen，而 ",[20,2913,661],{}," 不用，那麼只在 ",[20,2916,2917],{},"lib1\u002FCMakeLists.txt"," 寫 Eigen 即可。",[41,2920,2921],{"id":2921},"安裝庫",[50,2923,2925],{"className":52,"code":2924,"language":54,"meta":55,"style":55},"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",[20,2926,2927,2937,2943,2949,2955],{"__ignoreMap":55},[59,2928,2929,2931,2933,2935],{"class":61,"line":62},[59,2930,261],{"class":65},[59,2932,264],{"class":69},[59,2934,1616],{"class":65},[59,2936,1679],{"class":69},[59,2938,2939,2941],{"class":61,"line":76},[59,2940,1837],{"class":69},[59,2942,1840],{"class":65},[59,2944,2945,2947],{"class":61,"line":85},[59,2946,1846],{"class":69},[59,2948,1840],{"class":65},[59,2950,2951,2953],{"class":61,"line":91},[59,2952,272],{"class":69},[59,2954,275],{"class":65},[59,2956,2957],{"class":61,"line":98},[59,2958,88],{"class":69},[10,2960,2961],{},"作用：安裝庫文件。",[10,2963,2964],{},"不同平臺、不同庫類型會用到不同分類：",[1389,2966,2967,2980],{},[1392,2968,2969],{},[1395,2970,2971,2974,2977],{},[1398,2972,2973],{"align":1400},"分類",[1398,2975,2976],{"align":1400},"Linux 常見產物",[1398,2978,2979],{"align":1400},"目錄",[1406,2981,2982,2997,3012],{},[1395,2983,2984,2988,2993],{},[1411,2985,2986],{"align":1400},[20,2987,1522],{},[1411,2989,2990,2992],{"align":1400},[20,2991,1528],{}," 動態庫",[1411,2994,2995],{"align":1400},[20,2996,1376],{},[1395,2998,2999,3003,3008],{},[1411,3000,3001],{"align":1400},[20,3002,1539],{},[1411,3004,3005,3007],{"align":1400},[20,3006,1545],{}," 靜態庫",[1411,3009,3010],{"align":1400},[20,3011,1376],{},[1395,3013,3014,3018,3021],{},[1411,3015,3016],{"align":1400},[20,3017,1507],{},[1411,3019,3020],{"align":1400},"可執行文件",[1411,3022,3023],{"align":1400},[20,3024,1515],{},[10,3026,3027],{},"雖然本模板只支持 Linux，但保留三類寫法沒有壞處，也方便以後改靜態庫。",[41,3029,3030],{"id":3030},"安裝頭文件",[50,3032,3034],{"className":52,"code":3033,"language":54,"meta":55,"style":55},"install(DIRECTORY \"${CMAKE_CURRENT_LIST_DIR}\u002Finc\u002F\"\n  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}\n)\n",[20,3035,3036,3044,3050],{"__ignoreMap":55},[59,3037,3038,3040,3042],{"class":61,"line":62},[59,3039,261],{"class":65},[59,3041,1873],{"class":69},[59,3043,1876],{"class":244},[59,3045,3046,3048],{"class":61,"line":76},[59,3047,1882],{"class":69},[59,3049,1885],{"class":65},[59,3051,3052],{"class":61,"line":85},[59,3053,88],{"class":69},[10,3055,3056,3057,3060],{},"作用：安裝整個 ",[20,3058,3059],{},"inc\u002F"," 目錄裏的頭文件。",[10,3062,3063,3064,669],{},"注意路徑末尾的 ",[20,3065,3066],{},"\u002F",[50,3068,3069],{"className":52,"code":1876,"language":54,"meta":55,"style":55},[20,3070,3071],{"__ignoreMap":55},[59,3072,3073],{"class":61,"line":62},[59,3074,1876],{"class":244},[10,3076,3077,3078,3081,3082,3084],{},"表示安裝 ",[20,3079,3080],{},"inc"," 目錄裏面的內容，而不是安裝 ",[20,3083,3080],{}," 目錄本身。",[10,3086,3087],{},"源文件：",[50,3089,3091],{"className":3090,"code":2635,"language":398,"meta":55},[396],[20,3092,2635],{"__ignoreMap":55},[10,3094,3095],{},"安裝後：",[50,3097,3099],{"className":3098,"code":2673,"language":398,"meta":55},[396],[20,3100,2673],{"__ignoreMap":55},[10,3102,3103,3104,3106,3107,3109],{},"如果沒有末尾 ",[20,3105,3066],{},"，路徑結構可能會多一層 ",[20,3108,3080],{},"，變成不想要的形式。",[41,3111,3113],{"id":3112},"lib2-和-lib1-的關係","lib2 和 lib1 的關係",[10,3115,3116,499,3119,3121],{},[20,3117,3118],{},"lib2\u002FCMakeLists.txt",[20,3120,2917],{}," 基本一樣，只是：",[50,3123,3125],{"className":52,"code":3124,"language":54,"meta":55,"style":55},"set(PREFIX \"lib2\")\n",[20,3126,3127],{"__ignoreMap":55},[59,3128,3129,3131,3133,3135,3138],{"class":61,"line":62},[59,3130,1591],{"class":65},[59,3132,70],{"class":69},[59,3134,1596],{"class":111},[59,3136,3137],{"class":244}," \"lib2\"",[59,3139,88],{"class":69},[10,3141,3142],{},"所以 target 變成：",[50,3144,3146],{"className":3145,"code":575,"language":398,"meta":55},[396],[20,3147,575],{"__ignoreMap":55},[10,3149,3150],{},"頭文件路徑變成：",[50,3152,3155],{"className":3153,"code":3154,"language":398,"meta":55},[396],"lib2\u002Feigen3_test.hpp\n",[20,3156,3154],{"__ignoreMap":55},[10,3158,3159],{},"C++ 命名空間也要分開：",[50,3161,3163],{"className":672,"code":3162,"language":674,"meta":55,"style":55},"namespace lib1 {\nvoid run_eigen_vector_example();\n}\n",[20,3164,3165,3173,3181],{"__ignoreMap":55},[59,3166,3167,3169,3171],{"class":61,"line":62},[59,3168,809],{"class":65},[59,3170,812],{"class":111},[59,3172,815],{"class":69},[59,3174,3175,3177,3179],{"class":61,"line":76},[59,3176,824],{"class":65},[59,3178,827],{"class":111},[59,3180,718],{"class":69},[59,3182,3183],{"class":61,"line":85},[59,3184,735],{"class":69},[50,3186,3188],{"className":672,"code":3187,"language":674,"meta":55,"style":55},"namespace lib2 {\nvoid run_eigen_matrix_example();\n}\n",[20,3189,3190,3199,3208],{"__ignoreMap":55},[59,3191,3192,3194,3197],{"class":61,"line":62},[59,3193,809],{"class":65},[59,3195,3196],{"class":111}," lib2",[59,3198,815],{"class":69},[59,3200,3201,3203,3206],{"class":61,"line":76},[59,3202,824],{"class":65},[59,3204,3205],{"class":111}," run_eigen_matrix_example",[59,3207,718],{"class":69},[59,3209,3210],{"class":61,"line":85},[59,3211,735],{"class":69},[10,3213,3214],{},"避免兩個庫都定義全局函數：",[50,3216,3218],{"className":672,"code":3217,"language":674,"meta":55,"style":55},"void main_test();\n",[20,3219,3220],{"__ignoreMap":55},[59,3221,3222,3224,3227],{"class":61,"line":62},[59,3223,824],{"class":65},[59,3225,3226],{"class":111}," main_test",[59,3228,718],{"class":69},[10,3230,3231],{},"否則鏈接時可能發生符號衝突。",[41,3233,3235],{"id":3234},"添加新庫-lib3","添加新庫 lib3",[10,3237,3238,3239,3241,3242,3245],{},"複製 ",[20,3240,550],{}," 爲 ",[20,3243,3244],{},"src\u002Flib3"," 後，需要改這些地方：",[14,3247,3248],{},[17,3249,3250],{},[20,3251,3252],{},"src\u002Flib3\u002FCMakeLists.txt",[50,3254,3255],{"className":52,"code":1969,"language":54,"meta":55,"style":55},[20,3256,3257],{"__ignoreMap":55},[59,3258,3259,3261,3263,3265,3267],{"class":61,"line":62},[59,3260,1591],{"class":65},[59,3262,70],{"class":69},[59,3264,1596],{"class":111},[59,3266,1982],{"class":244},[59,3268,88],{"class":69},[14,3270,3271],{"start":76},[17,3272,3273],{},"頭文件目錄：",[50,3275,3278],{"className":3276,"code":3277,"language":398,"meta":55},[396],"src\u002Flib3\u002Finc\u002Flib3\u002Fxxx.hpp\n",[20,3279,3277],{"__ignoreMap":55},[14,3281,3282],{"start":85},[17,3283,3284],{},"C++ 命名空間：",[50,3286,3288],{"className":672,"code":3287,"language":674,"meta":55,"style":55},"namespace lib3 {\n}\n",[20,3289,3290,3299],{"__ignoreMap":55},[59,3291,3292,3294,3297],{"class":61,"line":62},[59,3293,809],{"class":65},[59,3295,3296],{"class":111}," lib3",[59,3298,815],{"class":69},[59,3300,3301],{"class":61,"line":76},[59,3302,735],{"class":69},[14,3304,3305],{"start":91},[17,3306,3307,3309],{},[20,3308,22],{}," 添加：",[50,3311,3313],{"className":52,"code":3312,"language":54,"meta":55,"style":55},"add_subdirectory(lib3)\n\ntarget_link_libraries(${PROJECT_NAME}\n  PRIVATE\n    lib3_src_lib\n)\n",[20,3314,3315,3322,3326,3334,3338,3343],{"__ignoreMap":55},[59,3316,3317,3319],{"class":61,"line":62},[59,3318,140],{"class":65},[59,3320,3321],{"class":69},"(lib3)\n",[59,3323,3324],{"class":61,"line":76},[59,3325,95],{"emptyLinePlaceholder":94},[59,3327,3328,3330,3332],{"class":61,"line":85},[59,3329,101],{"class":65},[59,3331,70],{"class":69},[59,3333,73],{"class":65},[59,3335,3336],{"class":61,"line":91},[59,3337,112],{"class":111},[59,3339,3340],{"class":61,"line":98},[59,3341,3342],{"class":69},"    lib3_src_lib\n",[59,3344,3345],{"class":61,"line":108},[59,3346,88],{"class":69},[10,3348,3349,3350,3352],{},"實際項目中，建議把所有 ",[20,3351,140],{}," 放在一起，所有主程序鏈接庫也放在一起，文件會更清楚。",[3354,3355,3356],"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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":55,"searchDepth":76,"depth":76,"links":3358},[3359,3360,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3380,3381,3382,3383,3384,3385],{"id":43,"depth":76,"text":22},{"id":66,"depth":76,"text":66,"children":3361},[3362],{"id":404,"depth":85,"text":407},{"id":463,"depth":76,"text":463},{"id":527,"depth":76,"text":527},{"id":651,"depth":76,"text":652},{"id":1131,"depth":76,"text":1132},{"id":1270,"depth":76,"text":1273},{"id":1451,"depth":76,"text":1451},{"id":1576,"depth":76,"text":1577},{"id":1893,"depth":76,"text":1896},{"id":2015,"depth":76,"text":2018},{"id":2215,"depth":76,"text":2215},{"id":1642,"depth":76,"text":1642},{"id":1672,"depth":76,"text":1672,"children":3375},[3376,3377,3378],{"id":2588,"depth":85,"text":2591},{"id":2640,"depth":85,"text":2643},{"id":2691,"depth":85,"text":3379},"爲什麼頭文件放 inc\u002Flib1\u002F",{"id":2761,"depth":76,"text":2762},{"id":2834,"depth":76,"text":2837},{"id":2921,"depth":76,"text":2921},{"id":3030,"depth":76,"text":3030},{"id":3112,"depth":76,"text":3113},{"id":3234,"depth":76,"text":3235},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","2200-0300","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-hant:2023-10-05-cplusplus-jiao-xue","\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解",false,null,"zh-Hant","zh-hant",{},{"title":5,"description":12},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","9iFnMk1eyPyVdblq564vEv7CHu6b_aAxIKJXR3fLbLA",[3405,3411,3416,3421,3426,3431,3436,3441,3446,3451,3456,3461,3466,3471,3476,3481,3486,3491,3496,3501,3506,3511,3516,3521,3526,3531,3536,3541,3546,3551,3556,3561,3566,3571,3576,3581,3586,3591,3596,3601,3606,3611,3616,3621,3626,3631,3636,3641,3646,3651,3656,3661,3666,3671,3676,3681,3686,3691,3696,3701,3706,3711,3716,3721,3726,3731,3736,3741,3746,3751,3756,3761,3766,3771,3776,3781,3786,3791,3792,3797,3802,3807],{"path":3406,"stem":3407,"title":3408,"date":3388,"chapterOrder":3409,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++開發環境搭建與測試","0100",0,{"path":3412,"stem":3413,"title":3414,"date":3388,"chapterOrder":3415,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基礎初識","0200",{"path":3417,"stem":3418,"title":3419,"date":3388,"chapterOrder":3420,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","數據類型與數據存放","0300",{"path":3422,"stem":3423,"title":3424,"date":3388,"chapterOrder":3425,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","輸入輸出","0400",{"path":3427,"stem":3428,"title":3429,"date":3388,"chapterOrder":3430,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","運算符","0500",{"path":3432,"stem":3433,"title":3434,"date":3388,"chapterOrder":3435,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程結構","0600",{"path":3437,"stem":3438,"title":3439,"date":3388,"chapterOrder":3440,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","數組","0700",{"path":3442,"stem":3443,"title":3444,"date":3388,"chapterOrder":3445,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函數與頭文件","0800",{"path":3447,"stem":3448,"title":3449,"date":3388,"chapterOrder":3450,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指針","0900",{"path":3452,"stem":3453,"title":3454,"date":3388,"chapterOrder":3455,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","結構體與共用體","1000",{"path":3457,"stem":3458,"title":3459,"date":3388,"chapterOrder":3460,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","內存分區與生命週期","1100",{"path":3462,"stem":3463,"title":3464,"date":3388,"chapterOrder":3465,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":3467,"stem":3468,"title":3469,"date":3388,"chapterOrder":3470,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函數提高與命名空間","1300",{"path":3472,"stem":3473,"title":3474,"date":3388,"chapterOrder":3475,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封裝","1400-0100",{"path":3477,"stem":3478,"title":3479,"date":3388,"chapterOrder":3480,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","對象初始化和清理","1400-0200",{"path":3482,"stem":3483,"title":3484,"date":3388,"chapterOrder":3485,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","對象模型與this指針","1400-0300",{"path":3487,"stem":3488,"title":3489,"date":3388,"chapterOrder":3490,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元與運算符重載","1400-0400",{"path":3492,"stem":3493,"title":3494,"date":3388,"chapterOrder":3495,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","繼承","1400-0500",{"path":3497,"stem":3498,"title":3499,"date":3388,"chapterOrder":3500,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多態","1400-0600",{"path":3502,"stem":3503,"title":3504,"date":3388,"chapterOrder":3505,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","類和對象","1400",{"path":3507,"stem":3508,"title":3509,"date":3388,"chapterOrder":3510,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":3512,"stem":3513,"title":3514,"date":3388,"chapterOrder":3515,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","異常處理","1600",{"path":3517,"stem":3518,"title":3519,"date":3388,"chapterOrder":3520,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":3522,"stem":3523,"title":3524,"date":3388,"chapterOrder":3525,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初識","1800-0100",{"path":3527,"stem":3528,"title":3529,"date":3388,"chapterOrder":3530,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":3532,"stem":3533,"title":3534,"date":3388,"chapterOrder":3535,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":3537,"stem":3538,"title":3539,"date":3388,"chapterOrder":3540,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":3542,"stem":3543,"title":3544,"date":3388,"chapterOrder":3545,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":3547,"stem":3548,"title":3549,"date":3388,"chapterOrder":3550,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":3552,"stem":3553,"title":3554,"date":3388,"chapterOrder":3555,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":3557,"stem":3558,"title":3559,"date":3388,"chapterOrder":3560,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":3562,"stem":3563,"title":3564,"date":3388,"chapterOrder":3565,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":3567,"stem":3568,"title":3569,"date":3388,"chapterOrder":3570,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":3572,"stem":3573,"title":3574,"date":3388,"chapterOrder":3575,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函數對象與謂詞","1800-1100",{"path":3577,"stem":3578,"title":3579,"date":3388,"chapterOrder":3580,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":3582,"stem":3583,"title":3584,"date":3388,"chapterOrder":3585,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高編程","1800",{"path":3587,"stem":3588,"title":3589,"date":3388,"chapterOrder":3590,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++類型轉換","1900",{"path":3592,"stem":3593,"title":3594,"date":3388,"chapterOrder":3595,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":3597,"stem":3598,"title":3599,"date":3388,"chapterOrder":3600,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":3602,"stem":3603,"title":3604,"date":3388,"chapterOrder":3605,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":3607,"stem":3608,"title":3609,"date":3388,"chapterOrder":3610,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":3612,"stem":3613,"title":3614,"date":3388,"chapterOrder":3615,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","範圍 for 循環","2000-0500",{"path":3617,"stem":3618,"title":3619,"date":3388,"chapterOrder":3620,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","結構化綁定","2000-0600",{"path":3622,"stem":3623,"title":3624,"date":3388,"chapterOrder":3625,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":3627,"stem":3628,"title":3629,"date":3388,"chapterOrder":3630,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII","2000-0800",{"path":3632,"stem":3633,"title":3634,"date":3388,"chapterOrder":3635,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指針","2000-0900",{"path":3637,"stem":3638,"title":3639,"date":3388,"chapterOrder":3640,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移動語義","2000-1000",{"path":3642,"stem":3643,"title":3644,"date":3388,"chapterOrder":3645,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表達式","2000-1100",{"path":3647,"stem":3648,"title":3649,"date":3388,"chapterOrder":3650,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":3652,"stem":3653,"title":3654,"date":3388,"chapterOrder":3655,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":3657,"stem":3658,"title":3659,"date":3388,"chapterOrder":3660,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":3662,"stem":3663,"title":3664,"date":3388,"chapterOrder":3665,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":3667,"stem":3668,"title":3669,"date":3388,"chapterOrder":3670,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":3672,"stem":3673,"title":3674,"date":3388,"chapterOrder":3675,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":3677,"stem":3678,"title":3679,"date":3388,"chapterOrder":3680,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":3682,"stem":3683,"title":3684,"date":3388,"chapterOrder":3685,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 與 join","2000-1900-0100",{"path":3687,"stem":3688,"title":3689,"date":3388,"chapterOrder":3690,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 與 lock_guard","2000-1900-0200",{"path":3692,"stem":3693,"title":3694,"date":3388,"chapterOrder":3695,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":3697,"stem":3698,"title":3699,"date":3388,"chapterOrder":3700,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":3702,"stem":3703,"title":3704,"date":3388,"chapterOrder":3705,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","併發編程","2000-1900",{"path":3707,"stem":3708,"title":3709,"date":3388,"chapterOrder":3710,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":3712,"stem":3713,"title":3714,"date":3388,"chapterOrder":3715,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 簡介","2000-2100",{"path":3717,"stem":3718,"title":3719,"date":3388,"chapterOrder":3720,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","現代C++","2000",{"path":3722,"stem":3723,"title":3724,"date":3388,"chapterOrder":3725,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定時器與異步 IO","2100-0100-0100",{"path":3727,"stem":3728,"title":3729,"date":3388,"chapterOrder":3730,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基礎","2100-0100-0200",{"path":3732,"stem":3733,"title":3734,"date":3388,"chapterOrder":3735,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":3737,"stem":3738,"title":3739,"date":3388,"chapterOrder":3740,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":3742,"stem":3743,"title":3744,"date":3388,"chapterOrder":3745,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":3747,"stem":3748,"title":3749,"date":3388,"chapterOrder":3750,"chapterDepth":76,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","機器人工程寫法與 ROS2 集成","2100-0100-0600",{"path":3752,"stem":3753,"title":3754,"date":3388,"chapterOrder":3755,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio異步IO庫","2100-0100",{"path":3757,"stem":3758,"title":3759,"date":3388,"chapterOrder":3760,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen線性代數庫","2100-0200",{"path":3762,"stem":3763,"title":3764,"date":3388,"chapterOrder":3765,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV計算機視覺庫","2100-0300",{"path":3767,"stem":3768,"title":3769,"date":3388,"chapterOrder":3770,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL點雲庫","2100-0400",{"path":3772,"stem":3773,"title":3774,"date":3388,"chapterOrder":3775,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李羣李代數庫","2100-0500",{"path":3777,"stem":3778,"title":3779,"date":3388,"chapterOrder":3780,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用庫學習","2100",{"path":3782,"stem":3783,"title":3784,"date":3388,"chapterOrder":3785,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets與構建安裝","2200-0100",{"path":3787,"stem":3788,"title":3789,"date":3388,"chapterOrder":3790,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","頂層CMake與公共編譯選項","2200-0200",{"path":3386,"stem":3402,"title":5,"date":3388,"chapterOrder":3387,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},{"path":3793,"stem":3794,"title":3795,"date":3388,"chapterOrder":3796,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方庫依賴寫法","2200-0400",{"path":3798,"stem":3799,"title":3800,"date":3388,"chapterOrder":3801,"chapterDepth":62,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板擴展與常見問題","2200-0500",{"path":3803,"stem":3804,"title":3805,"date":3388,"chapterOrder":3806,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":3395},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":3391,"stem":3808,"title":3809,"date":3388,"chapterOrder":3396,"chapterDepth":3410,"docKey":3390,"docRoot":3391,"docTitle":3392,"isWikiDoc":94,"isWikiIndex":94},"_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":3811},[3812,3815,3816,3819,3822],{"path":3813,"localeSlug":3814,"i18nKey":3394},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","en-us",{"path":3386,"localeSlug":3398,"i18nKey":3394},{"path":3817,"localeSlug":3818,"i18nKey":3394},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","zh-hk",{"path":3820,"localeSlug":3821,"i18nKey":3394},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","zh-tw",{"path":3823,"localeSlug":3824,"i18nKey":3394},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","zh-cn",[3813,3401,3386,3401,3817,3401,3820,3401,3823,3401],1784646817746]