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