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