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