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