¡¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓ"/> 2024-09-27 15:17¡¤ÖðÈÕ¾­¼ÃÐÂÎÅ"/>

ÌÚ²©tengbo9885¹ÙÍø

¡¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓ

¡¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓ

¡¶¡¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓ¡·¾çÇé¼ò½é£º2024-09-27 15:17¡¤ÖðÈÕ¾­¼ÃÐÂÎżûµ½·½Ô´Ã»ÓÐÀí²Ç×Ô¼ºÔ­±¾ÐÅÐÄÊ®×ãµÄÎäÁÉÀãÁ˺Ãһϡ¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓÓÚÊÇËý±ãµÀ£º¿ÉÄÜÐÔÊÇÓеĵ«Ê×ÏÈÄãµÃÓöµ½ÄãÏë°®µÄÈËÄÅÕâÖÖÈ˿ɲ»ÊǵùÄïÒ²²»ÊÇÄãÉí±ßµÄÄÇЩٰé¶ùuwµ«³Â¼ÒÁÖ×ÜÊÇ»áο½åËýËýÒ²ÔٴμᶨÁË×Ô¼ºµÄÑ¡ÔñÎÞÂÛÊÇË­À´È°ËµÁ½È˶¼Ã»Óб»Ëµ¶¯¹ý

¡¶¡¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓ¡·ÊÓÆµËµÃ÷£º·½º®ÄÇÀïÉÐÓÐÍÆ²â²»µ½Ì«Ò»ÃÅѧÉúÐÄ˼µÄÔ­ÀíËûµÄ¾«Ã÷ʯͷ֮Öж¼Òª¼·³öÓÍË®À´ÕÕÆ¬ÖйÃÂèÊÝСµÄÉíÇûÍì×ÅÎÒµÄÊÖ±ÛÁ³ÉÏÊÇÑÚ²»×¡µÄ×ÔÂúÎÒÖÒʵµØÏòËýÖÂǸ£ºÏþÝæÉϴεÄÊÂÇéÎÒÕæµÄºÜÊÇÇ¸ØÆÎÒÌ«²»×ðÖØÄãÁËÏ£ÍûÄãÄÜÔ­ÁÂÎÒ ÎÒ¿´×ÅËýµÄÑÛ¾¦Ï£ÍûÄÜ´ÓËýµÄÐÄÇéÖп´µ½Ò»Ë¿Ô­Áµļ£Ïó

CMake¹¹½¨MakefileÉî¶ÈÆÊÎö£º´Óµ×²ãÔ­Àíµ½ÖØ´óÏîÄ¿2023-06-10 21:24¡¤linuxÊÖÒÕÕ»Ò»¡¢CMake¹¹½¨ºóµÄÏîÄ¿½á¹¹ÆÊÎö£¨Analysis of the Project Structure After CMake Build£©1.1 CMake¹¹½¨ºóµÄĿ¼½á¹¹£¨Directory Structure After CMake Build£©CMake¹¹½¨Íê³Éºó»áÔÚÏîÄ¿µÄ¸ùĿ¼ÏÂÌìÉúÒ»¸öÃûΪbuildµÄĿ¼Õâ¸öĿ¼ÊÇCMake¹¹½¨Àú³ÌÖÐËùÓÐÖÐÐÄÎļþºÍ×îÖÕÌìÉúµÄÄ¿µÄÎļþµÄ´æ·ÅµØÏÂÃæÎÒÃǽ«ÏêϸÆÊÎöÕâ¸öĿ¼µÄ½á¹¹Ê×ÏÈÎÒÃÇÀ´¿´Ò»ÏÂbuildĿ¼µÄÒ»¼¶×ÓĿ¼£ºCMakeFiles£ºÕâ¸öĿ¼Öдæ·ÅµÄÊÇCMakeÔÚ¹¹½¨Àú³ÌÖÐÌìÉúµÄÔÝʱÎļþ°üÀ¨±àÒëÆ÷¼ì²éµÄЧ¹û¡¢FindÄ£¿é£¨Find Modules£©²éÕÒµÄЧ¹ûµÈÕâЩÎļþÖ÷ÒªÓÃÓÚCMake×ÔÉíµÄÐèÇóÒ»Ñùƽ³£ÇéÐÎÏÂÎÒÃDz»ÐèÒª¹Ø×¢Õâ¸öĿ¼µÄÄÚÈÝTesting£ºÈôÊÇÄãµÄÏîÄ¿ÖаüÀ¨ÁËCTest²âÊÔÄÇôÕâ¸öĿ¼½«»á±»ÌìÉúËü°üÀ¨ÁËËùÓÐCTest²âÊÔµÄЧ¹ûbin£ºÕâ¸öĿ¼ÖаüÀ¨ÁËËùÓеĿÉÖ´ÐÐÎļþ£¨Executable Files£©ÈôÊÇÄãµÄCMakeÏîÄ¿ÖаüÀ¨Á˶à¸ö¿ÉÖ´ÐÐÎļþÄÇôËüÃǶ¼»á±»·ÅÔÚÕâ¸öĿ¼ÖÐlib£ºÕâ¸öĿ¼ÖаüÀ¨ÁËËùÓеĿâÎļþ£¨Library Files£©ÎÞÂÛÊǾ²Ì¬¿â£¨Static Libraries£©Õվɶ¯Ì¬¿â£¨Dynamic Libraries£©¶¼»á±»·ÅÔÚÕâ¸öĿ¼ÖнÓÏÂÀ´ÎÒÃÇÔÙÉîÈëµ½CMakeFilesĿ¼Öп´Ò»ÏÂËüµÄ¶þ¼¶×ÓĿ¼£ºproject.dir£ºÕâ¸öĿ¼ÖаüÀ¨ÁËÏîÄ¿¹¹½¨Àú³ÌÖеÄÔÝʱÎļþÈç.oÎļþºÍ.dÎļþÕâЩÎļþÊDZàÒëÆ÷ÔÚ±àÒëÔ´´úÂëʱÌìÉúµÄCMakeOutput.log£ºÕâ¸öÎļþ¼Í¼ÁËCMakeÔÚÉèÖÃÀú³ÌÖеÄÊä³öÐÅÏ¢°üÀ¨±àÒëÆ÷¼ì²éµÄЧ¹û¡¢FindÄ£¿é²éÕÒµÄЧ¹ûµÈCMakeError.log£ºÕâ¸öÎļþ¼Í¼ÁËCMakeÔÚÉèÖÃÀú³ÌÖÐÓöµ½µÄ¹ýʧÐÅÏ¢ÒÔÉϾÍÊÇCMake¹¹½¨ºóµÄĿ¼½á¹¹µÄ»ù±¾ÇéÐÎÔÚÏÖʵµÄÏîÄ¿ÖпÉÄÜ»áÆ¾Ö¤ÏîÄ¿µÄÏêϸÐèÇóÌìÉú¸ü¶àµÄ×ÓĿ¼ºÍÎļþ¿ÉÊÇÕâЩ»ù±¾µÄĿ¼ºÍÎļþÊÇÄãÔÚÈκÎÒ»¸öʹÓÃCMake¹¹½¨µÄÏîÄ¿Öж¼ÄÜ¿´µ½µÄ1.2 ¹¹½¨ÌìÉúµÄÎļþÀàÐͼ°Æä×÷Óã¨Types of Files Generated by the Build and Their Functions£©CMake¹¹½¨Àú³ÌÖлáÌìÉú¶àÖÖÀàÐ͵ÄÎļþÿÖÖÎļþ¶¼ÓÐÆäÌØ¶¨µÄ×÷ÓÃÏÂÃæÎÒÃǽ«ÏêϸÆÊÎöÕâЩÎļþµÄÀàÐͺÍ×÷ÓÃCMakeFilesĿ¼£ºÕâ¸öĿ¼Öдæ·ÅµÄÊÇCMakeÔÚ¹¹½¨Àú³ÌÖÐÌìÉúµÄÔÝʱÎļþ°üÀ¨±àÒëÆ÷¼ì²éµÄЧ¹û¡¢FindÄ£¿é£¨Find Modules£©²éÕÒµÄЧ¹ûµÈÕâЩÎļþÖ÷ÒªÓÃÓÚCMake×ÔÉíµÄÐèÇóÒ»Ñùƽ³£ÇéÐÎÏÂÎÒÃDz»ÐèÒª¹Ø×¢Õâ¸öĿ¼µÄÄÚÈÝproject.dirĿ¼£ºÕâ¸öĿ¼ÖаüÀ¨ÁËÏîÄ¿¹¹½¨Àú³ÌÖеÄÔÝʱÎļþÈç.oÎļþºÍ.dÎļþÕâЩÎļþÊDZàÒëÆ÷ÔÚ±àÒëÔ´´úÂëʱÌìÉúµÄCMakeOutput.logÎļþ£ºÕâ¸öÎļþ¼Í¼ÁËCMakeÔÚÉèÖÃÀú³ÌÖеÄÊä³öÐÅÏ¢°üÀ¨±àÒëÆ÷¼ì²éµÄЧ¹û¡¢FindÄ£¿é²éÕÒµÄЧ¹ûµÈCMakeError.logÎļþ£ºÕâ¸öÎļþ¼Í¼ÁËCMakeÔÚÉèÖÃÀú³ÌÖÐÓöµ½µÄ¹ýʧÐÅÏ¢TestingĿ¼£ºÈôÊÇÄãµÄÏîÄ¿ÖаüÀ¨ÁËCTest²âÊÔÄÇôÕâ¸öĿ¼½«»á±»ÌìÉúËü°üÀ¨ÁËËùÓÐCTest²âÊÔµÄЧ¹ûbinĿ¼£ºÕâ¸öĿ¼ÖаüÀ¨ÁËËùÓеĿÉÖ´ÐÐÎļþ£¨Executable Files£©ÈôÊÇÄãµÄCMakeÏîÄ¿ÖаüÀ¨Á˶à¸ö¿ÉÖ´ÐÐÎļþÄÇôËüÃǶ¼»á±»·ÅÔÚÕâ¸öĿ¼ÖÐlibĿ¼£ºÕâ¸öĿ¼ÖаüÀ¨ÁËËùÓеĿâÎļþ£¨Library Files£©ÎÞÂÛÊǾ²Ì¬¿â£¨Static Libraries£©Õվɶ¯Ì¬¿â£¨Dynamic Libraries£©¶¼»á±»·ÅÔÚÕâ¸öĿ¼ÖÐÒÔÉϾÍÊÇCMake¹¹½¨Àú³ÌÖÐÌìÉúµÄÖ÷ÒªÎļþÀàÐͼ°Æä×÷ÓÃÃ÷È·ÕâЩÎļþµÄ×÷ÓÿÉÒÔ×ÊÖúÎÒÃǸüºÃµØÃ÷È·CMakeµÄ¹¹½¨Àú³Ì1.3 CMakeLists.txtÓëÌìÉúµÄMakefileµÄ¹ØÏµ£¨The Relationship Between CMakeLists.txt and the Generated Makefile£©ÔÚCMake¹¹½¨ÏµÍ³ÖÐCMakeLists.txtÎļþºÍÌìÉúµÄMakefileÎļþÖ®¼ä±£´æ×ÅÇ×½üµÄ¹ØÏµÏÂÃæÎÒÃǽ«ÏêϸÆÊÎöÕâÖÖ¹ØÏµCMakeLists.txtÊÇCMake¹¹½¨ÏµÍ³µÄ½¹µãÎļþËü½ç˵ÁËÏîÄ¿µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµÔÚÖ´ÐÐCMakeÏÂÁîʱCMake»á¶ÁÈ¡CMakeLists.txtÎļþÆÊÎöÆäÖеĹ¹½¨¹æÔòºÍÒÀÀµ¹ØÏµÈ»ºóÌìÉúÏìÓ¦µÄMakefileÎļþMakefileÎļþÊÇÓÉCMakeƾ֤CMakeLists.txtÎļþÌìÉúµÄËüÊÇMake¹¹½¨¹¤¾ß¿ÉÒÔÖ±½Ó¶ÁÈ¡µÄ¹¹½¨¾ç±¾MakefileÎļþÖаüÀ¨ÁËÏêϸµÄ±àÒëÏÂÁîºÍÁ´½ÓÏÂÁîÒÔ¼°Ô´ÎļþºÍÄ¿µÄÎļþÖ®¼äµÄÒÀÀµ¹ØÏµÔÚÒ»¸öCMakeÏîÄ¿ÖÐͨ³ £»áÓжà¸öCMakeLists.txtÎļþÿ¸öĿ¼Ï¶¼¿ÉÒÔÓÐÒ»¸öCMakeLists.txtÎļþÕâЩCMakeLists.txtÎļþÖнç˵µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµ»á±»CMakeºÏ²¢µ½Ò»ÆðÌìÉúÒ»¸ö»ò¶à¸öMakefileÎļþÈôÊÇÒ»¸öCMakeÏîÄ¿ÖÐÖ»ÓÐÒ»¸öCMakeLists.txtÎļþÄÇôCMake»áÌìÉúÒ»¸öMakefileÎļþÈôÊÇÒ»¸öCMakeÏîÄ¿ÖÐÓжà¸öCMakeLists.txtÎļþÄÇôCMake»áÔÚÿ¸öCMakeLists.txtÎļþËùÔÚµÄĿ¼ÏÂÌìÉúÒ»¸öMakefileÎļþÕâЩMakefileÎļþÖж¥²ãĿ¼ÏµÄMakefileÎļþÊÇÖ÷MakefileÎļþËü»áŲÓÃÆäËûĿ¼ÏµÄMakefileÎļþ×ܵÄÀ´ËµCMakeLists.txtÎļþºÍÌìÉúµÄMakefileÎļþÖ®¼äµÄ¹ØÏµÊÇ£ºCMakeLists.txtÎļþ½ç˵ÁËÏîÄ¿µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµCMakeƾ֤CMakeLists.txtÎļþÌìÉúMakefileÎļþÈ»ºóMakeƾ֤MakefileÎļþÖ´ÐÐÏêϸµÄ¹¹½¨Ê¹ÃüÏà¹ØÊÓÆµÍƼö´Ó³ÌÐò±àÒëµ½ÕÆÎÕ cmake ÏîÄ¿¹¹½¨¹¤¾ß2023¾ÍÒµÐÐÇéһƬÒõ»ÞÔõÑùÄõ½×Ô¼ºÀíÏëµÄoffer2023Äê×îÐÂÊÖÒÕͼÆ×c++ºó¶ËµÄ8¸öÊÖÒÕά¶ÈÖúÁ¦Äã¿ìËÙ³ÉΪ´óÅ£ÐèÒªC/C++ Linux·þÎñÆ÷¼Ü¹¹Ê¦Ñ§Ï°×ÊÁϼÓqun812855908»ñÈ¡£¨×ÊÁϰüÀ¨C/C++LinuxgolangÊÖÒÕNginxZeroMQMySQLRedisfastdfsMongoDBZKÁ÷ýÌåCDNP2PK8SDockerTCP/IPЭ³ÌDPDKffmpegµÈ£©Ãâ·Ñ·ÖÏí¶þ¡¢ÉîÈëÃ÷È·CMakeÌìÉúµÄMakefile2.1 MakefileµÄ»ù±¾½á¹¹ºÍÔ­ÀíMakefileÊÇGNU make¹¤¾ßµÄÉèÖÃÎļþËü½ç˵ÁËÒ»×鹿ÔòÀ´Ö¸¶¨ÄÄЩÎļþÐèÒª±»¸üÐÂÒÔ¼°ÔõÑù¸üÐÂÕâЩÎļþÔÚC++ÏîÄ¿ÖÐMakefileͨ³£ÓÃÓÚ±àÒëÔ´´úÂë²¢ÌìÉú¿ÉÖ´ÐÐÎļþMakefileµÄ»ù±¾½á¹¹°üÀ¨Èý¸ö²¿·Ö£ºÄ¿µÄ£¨Target£©¡¢ÒÀÀµ£¨Dependencies£©ºÍÏÂÁCommands£©Ä¿µÄ£¨Target£©£ºÕâÊÇÐèÒªÌìÉúµÄÎļþÃûËü¿ÉÒÔÊÇÒ»¸ö¹¤¾ßÎļþ£¨Object File£©Ò²¿ÉÒÔÊÇÒ»¸ö¿ÉÖ´ÐÐÎļþ£¨Executable File£©ÒÀÀµ£¨Dependencies£©£ºÕâЩÊÇÄ¿µÄÎļþÐèÒªµÄÔ´ÎļþÈôÊÇÈκÎÒ»¸öÒÀÀµÎļþ±ÈÄ¿µÄÎļþ¸üÐÂÄÇôĿµÄÎļþ¾ÍÐèÒª±»ÖØÐÂÌìÉúÏÂÁCommands£©£ºÕâЩÊÇÌìÉúÄ¿µÄÎļþËùÐèÒªÖ´ÐеÄshellÏÂÁîÕâЩÏÂÁî±ØÐèÒÔTab×Ö·û×îÏÈÏÂÃæÊÇÒ»¸ö¼òÆÓµÄMakefileʾÀý£ºtarget: dependencies commandsÔÚCMakeÖÐCMakeLists.txtÎļþÖеÄÖ¸Áî»á±»×ª»»ÎªMakefileÖеÄÄ¿µÄ¡¢ÒÀÀµºÍÏÂÁîÀýÈçadd_executableÖ¸Áî»áÌìÉúÒ»¸öÄ¿µÄtarget_link_librariesÖ¸Áî»áÌìÉúÒÀÀµ¶øÏÖʵµÄ±àÒëºÍÁ´½ÓÏÂÁîÔòÓÉCMake×Ô¶¯ÌìÉúÃ÷È·MakefileµÄ»ù±¾½á¹¹ºÍÔ­Àí¹ØÓÚÉîÈëÃ÷È·CMakeÌìÉúµÄMakefileÓÐ×ÅÖ÷ÒªµÄ×÷ÓÃÔÚÏÂÒ»½ÚÖÐÎÒÃǽ«½øÒ»²½Ì½ÌÖ¶à¸öCMakeLists.txtÌìÉúµÄMakefileµÄÆÊÎö2.2 ¶à¸öCMakeLists.txtÌìÉúµÄMakefileÆÊÎöÔÚ´óÐ͵ÄC++ÏîÄ¿ÖÐͨ³ £»áÓжà¸öCMakeLists.txtÎļþÿ¸öĿ¼Ï¶¼ÓÐÒ»¸öÕâÖֽṹÓÐÖúÓÚ¼á³ÖÏîÄ¿µÄÄ£¿é»¯ʹµÃÿ¸ö²¿·Ö¿ÉÒÔ×ÔÁ¦µØ±»¹¹½¨ºÍ²âÊÔµ±ÔËÐÐCMakeÏÂÁîʱËü»áÊ×ÏȲéÕÒ¸ùĿ¼ÏµÄCMakeLists.txtÎļþÈ»ºóµÝ¹éµØ´¦Öóͷ£Ã¿¸ö×ÓĿ¼ÖеÄCMakeLists.txtÎļþÿ¸öCMakeLists.txtÎļþ¶¼»áÌìÉúÒ»¸ö¶ÔÓ¦µÄMakefileÔÚÕâ¸öÀú³ÌÖÐCMake»á´¦Öóͷ£CMakeLists.txtÎļþÖеÄÖ¸ÁîÈçadd_executable¡¢add_library¡¢target_link_librariesµÈ²¢½«ÕâЩָÁîת»»ÎªMakefileÖеÄÄ¿µÄ¡¢ÒÀÀµºÍÏÂÁîÀýÈçÈôÊÇÎÒÃÇÓÐÈçϵÄĿ¼½á¹¹£ºproject/©À©¤©¤ CMakeLists.txt©À©¤©¤ main.cpp©¸©¤©¤ module/ ©À©¤©¤ CMakeLists.txt ©¸©¤©¤ module.cppÔÚ¸ùĿ¼µÄCMakeLists.txtÎļþÖÐÎÒÃÇ¿ÉÄÜ»áÓÐÈçϵÄÖ¸Áadd_executable(main main.cpp)add_subdirectory(module)target_link_libraries(main module)ÔÚmoduleĿ¼µÄCMakeLists.txtÎļþÖÐÎÒÃÇ¿ÉÄÜ»áÓÐÈçϵÄÖ¸Áadd_library(module module.cpp)ÔÚÕâ¸öÀý×ÓÖÐCMake»áÌìÉúÁ½¸öMakefileÒ»¸öÔÚprojectĿ¼Ò»¸öÔÚproject/moduleĿ¼ÔÚprojectĿ¼µÄMakefileÖлáÓÐÒ»¸öÃûΪmainµÄÄ¿µÄËüÒÀÀµÓÚmain.cppºÍmoduleĿ¼µÄMakefileÖÐÌìÉúµÄ¿âÔÚproject/moduleĿ¼µÄMakefileÖлáÓÐÒ»¸öÃûΪmoduleµÄÄ¿µÄËüÒÀÀµÓÚmodule.cppͨ¹ýÕâÖÖ·½·¨CMakeʹµÃÿ¸ö×ÓĿ¼¿ÉÒÔ×ÔÁ¦µØ±»¹¹½¨ͬʱҲ°ü¹ÜÁËÕû¸öÏîÄ¿µÄ¹¹½¨Ë³Ðò2.3 CMakeÓëMakefileµÄ¶ÔÓ¦¹ØÏµCMakeÊÇÒ»¸ö¿çƽ̨µÄ¹¹½¨ÏµÍ³ËüµÄÖ÷ҪʹÃüÊÇÆ¾Ö¤Óû§µÄÐèÇóÌìÉúÊʵ±µÄMakefileÎļþCMakeͨ¹ý¶ÁÈ¡CMakeLists.txtÎļþÀ´ÏàʶÓû§µÄÐèÇóÈ»ºóÌìÉú¶ÔÓ¦µÄMakefileÎļþÔÚCMakeÓëMakefileÖ®¼ä±£´æÒ»ÖÖÃ÷È·µÄ¶ÔÓ¦¹ØÏµCMakeLists.txtÎļþÖеÄÿһÌõÖ¸Áî¶¼»áÔÚÌìÉúµÄMakefileÎļþÖÐÓÐÒ»¸ö¶ÔÓ¦µÄÌåÏÖÏÂÃæÎÒÃÇÀ´¿´Ò»Ð©³£¼ûµÄCMakeÖ¸ÁîÒÔ¼°ËüÃÇÔÚMakefileÖеĶÔÓ¦¹ØÏµ£ºadd_executable£ºÕâ¸öCMakeÖ¸ÁîÓÃÓÚ½ç˵һ¸ö¿ÉÖ´ÐÐÎļþµÄÄ¿µÄÔÚÌìÉúµÄMakefileÖÐÕâ¸öÄ¿µÄ»á±»½ç˵Ϊһ¸ö¹æÔò¹æÔòµÄÄ¿µÄÊÇ¿ÉÖ´ÐÐÎļþÒÀÀµÏîÊÇÔ´ÎļþÏÂÁîÊDZàÒëÏÂÁîadd_library£ºÕâ¸öCMakeÖ¸ÁîÓÃÓÚ½ç˵һ¸ö¿âÎļþµÄÄ¿µÄÔÚÌìÉúµÄMakefileÖÐÕâ¸öÄ¿µÄÒ²»á±»½ç˵Ϊһ¸ö¹æÔò¹æÔòµÄÄ¿µÄÊÇ¿âÎļþÒÀÀµÏîÊÇÔ´ÎļþÏÂÁîÊDZàÒëÏÂÁîtarget_link_libraries£ºÕâ¸öCMakeÖ¸ÁîÓÃÓÚ½ç˵ĿµÄµÄÁ´½Ó¿âÔÚÌìÉúµÄMakefileÖÐÕâ¸öÖ¸Áî»áÓ°Ïìµ½Á´½ÓÏÂÁîÁ´½ÓÏÂÁî»á°üÀ¨¶ÔÓ¦µÄ¿âÎļþadd_subdirectory£ºÕâ¸öCMakeÖ¸ÁîÓÃÓÚÌí¼Ó×ÓĿ¼ÔÚÌìÉúµÄMakefileÖÐÕâ¸öÖ¸Áî»áµ¼ÖÂÌìÉúÒ»¸öеÄMakefileÎļþÔÚ¶ÔÓ¦µÄ×ÓĿ¼ÖÐͨ¹ýÃ÷È·CMakeÓëMakefileµÄ¶ÔÓ¦¹ØÏµÎÒÃÇ¿ÉÒÔ¸üºÃµØÃ÷È·CMakeµÄÊÂÇéÔ­ÀíÒÔ¼°ÔõÑù±àдÓÐÓõÄCMakeLists.txtÎļþÔÚÏÂÒ»Õ½ÚÖÐÎÒÃǽ«½øÒ»²½Ì½ÌÖCMake¹¹½¨Àú³ÌµÄµ×²ãÔ­ÀíÈý¡¢CMake¹¹½¨Àú³ÌµÄµ×²ãÔ­Àí£¨Underlying Principles of the CMake Build Process£©3.1 CMake¹¹½¨Àú³ÌµÄ»ù±¾Á÷³Ì£¨Basic Flow of the CMake Build Process£©CMakeµÄ¹¹½¨Àú³Ì¿ÉÒÔ·ÖΪÈý¸öÖ÷Òª°ì·¨£ºÉèÖã¨Configuration£©¡¢ÌìÉú£¨Generation£©ºÍ¹¹½¨£¨Build£©ÏÂÃæÎÒÃǽ«ÏêϸÆÊÎöÿ¸ö°ì·¨1¡¢ÉèÖã¨Configuration£©ÉèÖý׶ÎÊÇCMakeÆÊÎöCMakeLists.txtÎļþµÄÀú³ÌÔÚÕâ¸ö½×¶ÎCMake»á¶ÁÈ¡CMakeLists.txtÎļþ²¢Ö´ÐÐÆäÖеÄÏÂÁîÕâЩÏÂÁîÖ÷ÒªÓÃÓÚ¼ì²éϵͳÇéÐΣ¨ÀýÈç±àÒëÆ÷¡¢¿âµÈ£©ÉèÖù¹½¨Ñ¡ÏîÒÔ¼°½ç˵¹¹½¨Ä¿µÄ£¨ÀýÈç¿â¡¢¿ÉÖ´ÐÐÎļþµÈ£©CMakeLists.txtÎļþÊÇCMakeµÄ½¹µãËü½ç˵ÁËÏîÄ¿µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµÿ¸öĿ¼£¨°üÀ¨×ÓĿ¼£©Öж¼¿ÉÒÔÓÐÒ»¸öCMakeLists.txtÎļþÔÚÉèÖý׶ÎCMake»á´Ó¶¥²ãĿ¼µÄCMakeLists.txtÎļþ×îÏÈµÝ¹éµØ´¦Öóͷ£Ã¿¸ö×ÓĿ¼ÖеÄCMakeLists.txtÎļþ2¡¢ÌìÉú£¨Generation£©ÌìÉú½×¶ÎÊÇCMakeƾ֤ÉèÖý׶εÄЧ¹ûÌìÉúÏÖʵµÄ¹¹½¨ÎļþµÄÀú³ÌÕâЩ¹¹½¨Îļþͨ³£ÊÇMakefileÎļþµ«Ò²¿ÉÒÔÊÇÆäËûÀàÐ͵Ĺ¹½¨ÎļþÀýÈçNinja¹¹½¨Îļþ»òÕßVisual StudioÏîÄ¿ÎļþÕâÈ¡¾öÓÚÄãÑ¡ÔñµÄ¹¹½¨¹¤¾ßÔÚÌìÉú½×¶ÎCMake»á½«CMakeLists.txtÎļþÖнç˵µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµת»»Îª¹¹½¨¹¤¾ß¿ÉÒÔÃ÷È·µÄÐÎʽÀýÈçÈôÊÇÄãÑ¡ÔñµÄ¹¹½¨¹¤¾ßÊÇMakeCMake»áÌìÉúMakefileÎļþÿ¸öĿ¼£¨°üÀ¨×ÓĿ¼£©Öж¼»áÌìÉúÒ»¸öMakefileÎļþ3¡¢¹¹½¨£¨Build£©¹¹½¨½×¶ÎÊÇʹÓù¹½¨¹¤¾ß£¨ÀýÈçMake¡¢Ninja»òVisual Studio£©Æ¾Ö¤ÌìÉúµÄ¹¹½¨Îļþ±àÒëÔ´´úÂë²¢Á´½ÓÌìÉúÄ¿µÄÎļþµÄÀú³ÌÔÚ¹¹½¨½×¶Î¹¹½¨¹¤¾ß»á¶ÁÈ¡ÌìÉúµÄ¹¹½¨Îļþƾ֤ÆäÖнç˵µÄ¹æÔòºÍÒÀÀµ¹ØÏµÖ´ÐÐÏÖʵµÄ±àÒëºÍÁ´½Ó²Ù×÷¹¹½¨¹¤¾ß»á×Ô¶¯´¦Öóͷ£ÒÀÀµ¹ØÏµÈ·±£ÔÚ±àÒëºÍÁ´½ÓÒ»¸öÄ¿µÄÎļþ֮ǰÆäËùÓÐÒÀÀµµÄÄ¿µÄÎļþ¶¼ÒѾ­±»×¼È·µØ±àÒëºÍÁ´½ÓÒÔÉϾÍÊÇCMake¹¹½¨Àú³ÌµÄ»ù±¾Á÷³ÌÔÚÃ÷È·ÁËÕâ¸öÁ÷³ÌÖ®ºóÎÒÃǾͿÉÒÔ¸üÉîÈëµØÌ½ÌÖCMakeÔõÑùÌìÉúMakefileÒÔ¼°CMake¹¹½¨Àú³ÌÖеÄÒªº¦°ì·¨ÁË3.2 CMakeÔõÑùÌìÉúMakefile£¨How CMake Generates Makefile£©CMakeÌìÉúMakefileµÄÀú³ÌÊÇÔÚÆäÌìÉú½×¶ÎÍê³ÉµÄÕâ¸öÀú³ÌÖ÷񻃾¼°µ½CMakeµÄ½¹µã×é¼þ¡ª¡ªÌìÉúÆ÷£¨Generator£©ÏÂÃæÎÒÃǽ«ÏêϸÆÊÎöÕâ¸öÀú³Ì1¡¢Ñ¡ÔñÌìÉúÆ÷£¨Selecting a Generator£©ÔÚCMakeµÄÌìÉú½×¶Î×îÏÈʱÊ×ÏÈÐèҪѡÔñÒ»¸öÌìÉúÆ÷ÌìÉúÆ÷ÊÇCMakeµÄÒ»¸ö½¹µã×é¼þËüÈÏÕæ½«CMakeLists.txtÎļþÖеĹ¹½¨¹æÔòºÍÒÀÀµ¹ØÏµת»»ÎªÌض¨¹¹½¨¹¤¾ß¿ÉÒÔÃ÷È·µÄÐÎʽCMakeÖ§³Ö¶àÖÖÌìÉúÆ÷¿ÉÒÔÌìÉúMakefileÎļþÒ²¿ÉÒÔÌìÉúNinja¹¹½¨Îļþ»òÕßVisual StudioÏîÄ¿ÎļþµÈÑ¡ÔñÌìÉúÆ÷µÄ·½·¨Í¨³£ÊÇÔÚÔËÐÐCMakeÏÂÁîʱͨ¹ý-GÑ¡ÏîÖ¸¶¨ÀýÈçÈôÊÇÄãÏëÌìÉúUnixÆø¸ÅµÄMakefileÎļþ¿ÉÒÔʹÓÃ"Unix Makefiles"ÌìÉúÆ÷ÏÂÁîÈçÏ£ºcmake -G "Unix Makefiles"ÈôÊÇûÓÐÖ¸¶¨ÌìÉúÆ÷CMake»áÑ¡ÔñÒ»¸öĬÈϵÄÌìÉúÆ÷Õâ¸öĬÈϵÄÌìÉúÆ÷ͨ³£ÊÇÆ¾Ö¤ÄãµÄϵͳÇéÐÎ×Ô¶¯Ñ¡ÔñµÄ2¡¢ÌìÉúMakefileÑ¡ÔñºÃÌìÉúÆ÷Ö®ºóCMake¾Í»á×îÏÈÌìÉúMakefileÎļþÔÚÕâ¸öÀú³ÌÖÐCMake»á±éÀúÏîÄ¿ÖеÄÿ¸öĿ¼£¨°üÀ¨×ÓĿ¼£©¶Ôÿ¸öĿ¼ÖеÄCMakeLists.txtÎļþ¾ÙÐд¦Öóͷ£¹ØÓÚÿ¸öCMakeLists.txtÎļþCMake»áÆÊÎöÆäÖеÄÏÂÁîƾ֤ÕâЩÏÂÁî½ç˵µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµÌìÉú¶ÔÓ¦µÄMakefileÎļþÿ¸öCMakeLists.txtÎļþ¶¼»áÌìÉúÒ»¸öMakefileÎļþÕâ¸öMakefileÎļþÖаüÀ¨Á˱àÒëºÍÁ´½Ó¸ÃĿ¼ÖеÄÄ¿µÄÎļþËùÐèÒªµÄ¹æÔòºÍÏÂÁîÔÚÌìÉúMakefileÎļþʱCMake»á×Ô¶¯´¦Öóͷ£Ä¿µÄÎļþÖ®¼äµÄÒÀÀµ¹ØÏµÈôÊÇÒ»¸öÄ¿µÄÎļþÒÀÀµÓÚÆäËûÄ¿µÄÎļþCMake»áÔÚÌìÉúµÄMakefileÎļþÖÐΪÕâ¸öÄ¿µÄÎļþÌí¼ÓÏìÓ¦µÄÒÀÀµ¹æÔòÒÔÉϾÍÊÇCMakeÔõÑùÌìÉúMakefileµÄÀú³ÌÃ÷È·ÁËÕâ¸öÀú³ÌÎÒÃǾͿÉÒÔ¸üºÃµØÃ÷È·CMake¹¹½¨Àú³ÌÖеÄÒªº¦°ì·¨ÒÔ¼°CMakeÓëMakefileÖ®¼äµÄ¹ØÏµÁË3.3 CMake¹¹½¨Àú³ÌÖеÄÒªº¦°ì·¨£¨Key Steps in the CMake Build Process£©CMake¹¹½¨Àú³ÌÖеÄÒªº¦°ì·¨Ö÷Òª°üÀ¨ÒÔϼ¸¸ö·½Ã棺1¡¢ÆÊÎöCMakeLists.txtÎļþ£¨Parsing CMakeLists.txt Files£©ÕâÊÇCMake¹¹½¨Àú³ÌµÄµÚÒ»²½Ò²ÊÇ×îÒªº¦µÄÒ»²½CMakeLists.txtÎļþÊÇCMakeµÄ½¹µãËü½ç˵ÁËÏîÄ¿µÄ¹¹½¨¹æÔòºÍÒÀÀµ¹ØÏµCMakeÐèÒªÆÊÎöÕâ¸öÎļþÒÔ»ñÈ¡¹¹½¨ÏîÄ¿ËùÐèµÄËùÓÐÐÅÏ¢2¡¢¼ì²éϵͳÇéÐΣ¨Checking System Environment£©ÔÚCMakeLists.txtÎļþÖÐͨ³ £»á°üÀ¨Ò»Ð©¼ì²éϵͳÇéÐεÄÏÂÁîÀýÈç¼ì²é±àÒëÆ÷¡¢¿âµÈÕâЩÏÂÁîÔÚCMake¹¹½¨Àú³ÌÖлᱻִÐÐÒÔÈ·±£ÏµÍ³ÇéÐÎÖª×ãÏîÄ¿µÄ¹¹½¨ÐèÇó3¡¢ÌìÉú¹¹½¨Îļþ£¨Generating Build Files£©CMakeµÄÖ÷ҪʹÃüÊÇÌìÉú¹¹½¨ÎļþÕâЩ¹¹½¨Îļþͨ³£ÊÇMakefileÎļþµ«Ò²¿ÉÒÔÊÇÆäËûÀàÐ͵Ĺ¹½¨ÎļþÀýÈçNinja¹¹½¨Îļþ»òÕßVisual StudioÏîÄ¿ÎļþÕâÈ¡¾öÓÚÄãÑ¡ÔñµÄ¹¹½¨¹¤¾ßÌìÉú¹¹½¨ÎļþµÄÀú³ÌÊÇCMake¹¹½¨Àú³ÌÖеÄÒ»¸öÒªº¦°ì·¨4¡¢Ö´Ðй¹½¨ÏÂÁExecuting Build Commands£©ÔÚÌìÉúÁ˹¹½¨ÎļþÖ®ºó¾Í¿ÉÒÔ×îÏÈÖ´Ðй¹½¨ÏÂÁîÁËÕâЩ¹¹½¨ÏÂÁîͨ³£ÊÇÓɹ¹½¨¹¤¾ß£¨ÀýÈçMake¡¢Ninja»òVisual Studio£©Ö´ÐеĹ¹½¨¹¤¾ß»áƾ֤¹¹½¨ÎļþÖнç˵µÄ¹æÔòºÍÏÂÁî±àÒëÔ´´úÂë²¢Á´½ÓÌìÉúÄ¿µÄÎļþÒÔÉϾÍÊÇCMake¹¹½¨Àú³ÌÖеÄÒªº¦°ì·¨Ã÷È·ÁËÕâЩ°ì·¨ÎÒÃǾͿÉÒÔ¸üºÃµØÃ÷È·CMakeµÄÊÂÇéÔ­ÀíÒÔ¼°ÔõÑùʹÓÃCMake¾ÙÐÐÏîÄ¿¹¹½¨ÁËËÄ¡¢CMakeÔÚÖØ´óÏîÄ¿ÖеÄÓ¦Óã¨Application of CMake in Complex Projects£©4.1 ÖØ´óÏîÄ¿ÖеÄCMake¹¹½¨Õ½ÂÔ£¨CMake Build Strategy in Complex Projects£©ÔÚÖØ´óµÄÏîÄ¿ÖÐCMakeµÄ¹¹½¨Õ½ÂÔÐèÒªÔ½·¢Ï¸ÄåºÍÖÜÈ«ÎÒÃÇÐèҪ˼Á¿µ½ÏîÄ¿µÄÄ£¿é»¯ÒÀÀµ¹ØÏµÒÔ¼°¿ÉÄܱ£´æµÄƽ̨²î±ðÒÔÏÂÊÇһЩÔÚÖØ´óÏîÄ¿ÖÐʹÓÃCMakeµÄÕ½ÂԺͽ¨Òé4.1.1 Ä£¿é»¯µÄCMakeLists.txt£¨Modularized CMakeLists.txt£©ÔÚ´óÐÍÏîÄ¿ÖÐÎÒÃÇͨ³ £»á¿´µ½ÏîÄ¿±»»®·ÖΪ¶à¸öÄ£¿é»ò×ÓÏîÄ¿ÿ¸öÄ£¿é¶¼ÓÐ×Ô¼ºµÄÔ´´úÂëºÍÒÀÀµÕâÖÖÇéÐÎÏÂÎÒÃÇ¿ÉÒÔΪÿ¸öÄ£¿é½¨ÉèÒ»¸öCMakeLists.txtÎļþÕâÑù¿ÉÒÔʹ¹¹½¨Àú³ÌÔ½·¢ÇåÎúÒ²Àû±ãÎÒÃǹÜÀíÿ¸öÄ£¿éµÄ¹¹½¨¹æÔòÀýÈçÎÒÃÇ¿ÉÒÔÔÚÿ¸öÄ£¿éµÄĿ¼Ï½¨ÉèÒ»¸öCMakeLists.txtÎļþÈ»ºóÔÚÏîÄ¿µÄ¶¥¼¶Ä¿Â¼ÏµÄCMakeLists.txtÎļþÖÐʹÓÃadd_subdirectory()ÏÂÁîÀ´Ìí¼ÓÕâЩÄ£¿é4.1.2 ¹ÜÀíÒÀÀµ¹ØÏµ£¨Managing Dependencies£©ÔÚÖØ´óµÄÏîÄ¿Öвî±ðµÄÄ£¿é¿ÉÄÜ»áÓÐÖÖÖÖÒÀÀµ¹ØÏµCMakeÌṩÁËһЩÏÂÁîÀ´×ÊÖúÎÒÃǹÜÀíÕâЩÒÀÀµ¹ØÏµÀýÈçtarget_link_libraries()ÏÂÁî¿ÉÒÔÓÃÀ´Ö¸¶¨Ò»¸öÄ¿µÄÐèÒªÁ´½ÓµÄ¿âÔÚ´¦Öóͷ£ÒÀÀµ¹ØÏµÊ±ÎÒÃÇÐèÒª×¢ÖØµÄÒ»¸öÖ÷ÒªÔ­ÔòÊÇ£ºÖ»¹ÜÈÃÒÀÀµ¹ØÏµÃ÷È·ºÍÖ±¹ÛÕâÒâζ×ÅÈôÊÇÒ»¸öÄ£¿éAÒÀÀµÓÚÄ£¿éBÄÇôÔÚÄ£¿éAµÄCMakeLists.txtÎļþÖÐÎÒÃÇÓ¦¸ÃÃ÷È·µØÖ¸³öÕâ¸öÒÀÀµ¹ØÏµ4.1.3 ´¦Öóͷ£Æ½Ì¨²î±ð£¨Handling Platform Differences£©ÔÚ¿çÆ½Ì¨µÄÏîÄ¿ÖÐÎÒÃÇ¿ÉÄÜÐèÒª´¦Öóͷ£²î±ðƽ̨µÄ²î±ðCMakeÌṩÁËһЩ±äÁ¿ºÍÏÂÁîÀ´×ÊÖúÎÒÃÇ´¦Öóͷ£ÕâЩ²î±ðÀýÈçCMAKE_SYSTEM_NAME±äÁ¿¿ÉÒÔÓÃÀ´¼ì²âÄ¿½ñµÄ²Ù×÷ϵͳif()ÏÂÁî¿ÉÒÔÓÃÀ´Æ¾Ö¤²î±ðµÄÌõ¼þÖ´Ðвî±ðµÄÏÂÁîÔÚ´¦Öóͷ£Æ½Ì¨²î±ðʱÎÒÃÇÓ¦¸ÃÖ»¹Ü×èÖ¹Ó²±àÂëÌØ¶¨Æ½Ì¨µÄÐÅÏ¢Ïà·´ÎÒÃÇÓ¦¸Ã¾¡¿ÉÄܵØÊ¹ÓÃCMakeÌṩµÄ±äÁ¿ºÍÏÂÁîÕâÑù¿ÉÒÔʹÎÒÃǵÄCMakeLists.txtÎļþÔ½·¢Í¨ÓúͿÉά»¤ÒÔÉϾÍÊÇÔÚÖØ´óÏîÄ¿ÖÐʹÓÃCMakeµÄһЩսÂԺͽ¨ÒéÔÚÏÖʵӦÓÃÖÐÎÒÃÇ»¹ÐèҪƾ֤ÏîÄ¿µÄÏêϸÇéÐκÍÐèÇóÀ´µ÷½âºÍÓÅ»¯ÎÒÃǵÄCMake¹¹½¨Õ½ÂÔ4.1.4 ʹÓÃÏÖ´úCMakeÏÂÁUsing Modern CMake Commands£©ÏÖ´úµÄCMake°æ±¾ÌṩÁËһЩеÄÏÂÁîºÍÌØÕ÷ÕâЩÏÂÁîºÍÌØÕ÷¿ÉÒÔʹÎÒÃǵÄCMakeLists.txtÎļþÔ½·¢¾«Á·ºÍÒ×ÓÚÃ÷È·ÀýÈçtarget_include_directories()ÏÂÁî¿ÉÒÔÓÃÀ´Ö¸¶¨Ò»¸öÄ¿µÄµÄÍ·ÎļþËÑË÷·¾¶Õâ±ÈʹÓþɵÄinclude_directories()ÏÂÁîÔ½·¢ÎÞаºÍÖ±¹ÛÔÚʹÓÃÏÖ´úCMakeÏÂÁîʱÎÒÃÇÐèÒª×¢ÖØµÄÒ»¸öÖ÷ÒªÔ­ÔòÊÇ£ºÖ»¹ÜʹÓÃÄ¿µÄÊôÐÔ£¨target properties£©¶ø²»ÊÇÈ«¾Ö±äÁ¿£¨global variables£©ÕâÊÇÓÉÓÚÄ¿µÄÊôÐÔ¿ÉÒÔʹÎÒÃǵÄCMakeLists.txtÎļþÔ½·¢Ä£¿é»¯Ò²¸üÈÝÒ×Ã÷È·ºÍά»¤4.1.5 ʹÓÃCMakeµÄ¾ç±¾¹¦Ð§£¨Leveraging CMake¡¯s Scripting Capabilities£©CMake²»µ«ÊÇÒ»¸ö¹¹½¨¹¤¾ßËüÒ²ÊÇÒ»Ö־籾ÓïÑÔÎÒÃÇ¿ÉÒÔʹÓÃCMakeµÄ¾ç±¾¹¦Ð§À´ÊµÏÖÒ»Ð©ÖØ´óµÄ¹¹½¨Âß¼­ÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃif()¡¢foreach()µÈÏÂÁîÀ´±àдѭ»·ºÍÌõ¼þÓï¾äÔÚʹÓÃCMakeµÄ¾ç±¾¹¦Ð§Ê±ÎÒÃÇÐèÒª×¢ÖØµÄÒ»¸öÖ÷ÒªÔ­ÔòÊÇ£ºÖ»¹Ü×èֹ̫¹ýÖØ´óµÄ¾ç±¾Âß¼­Ì«¹ýÖØ´óµÄ¾ç±¾Âß¼­¿ÉÄÜ»áʹÎÒÃǵÄCMakeLists.txtÎļþÄÑÒÔÃ÷È·ºÍά»¤Ïà·´ÎÒÃÇÓ¦¸Ã¾¡¿ÉÄܵØÊ¹ÓÃCMakeÌṩµÄÏÂÁîºÍÌØÕ÷ÕâÑù¿ÉÒÔʹÎÒÃǵÄCMakeLists.txtÎļþÔ½·¢¾«Á·ºÍÒ×ÓÚÃ÷È·ÒÔÉϾÍÊÇÔÚÖØ´óÏîÄ¿ÖÐʹÓÃCMakeµÄһЩսÂԺͽ¨ÒéÔÚÏÖʵӦÓÃÖÐÎÒÃÇ»¹ÐèҪƾ֤ÏîÄ¿µÄÏêϸÇéÐκÍÐèÇóÀ´µ÷½âºÍÓÅ»¯ÎÒÃǵÄCMake¹¹½¨Õ½ÂÔ4.2 ¶à¸öCMakeLists.txtÔÚÖØ´óÏîÄ¿ÖеĹÜÀí£¨Management of Multiple CMakeLists.txt in Complex Projects£©ÔÚ´óÐ͵ÄÖØ´óÏîÄ¿ÖÐÎÒÃÇͨ³ £»áÓжà¸öCMakeLists.txtÎļþÿ¸ö×ÓĿ¼Ï¶¼¿ÉÄÜÓÐÒ»¸öÕâЩCMakeLists.txtÎļþÅäºÏ½ç˵ÁËÕû¸öÏîÄ¿µÄ¹¹½¨¹æÔò¹ÜÀíÕâЩCMakeLists.txtÎļþÊÇÒ»¸öÖ÷ÒªµÄʹÃüÒÔÏÂÊÇһЩսÂԺͽ¨Òé4.2.1 Ä£¿é»¯¹ÜÀí£¨Modular Management£©Ã¿¸öCMakeLists.txtÎļþÓ¦¸ÃÖ»ÈÏÕæ¹ÜÀíÆäËùÔÚĿ¼ÏµÄÔ´´úÂëºÍÒÀÀµÕâÑù¿ÉÒÔʹÿ¸öCMakeLists.txtÎļþµÄÄÚÈݼá³Ö¾«Á·Ò²Àû±ãÎÒÃÇÃ÷È·ºÍά»¤Ã¿¸öÄ£¿éµÄ¹¹½¨¹æÔò4.2.2 ͳһµÄ¹¹½¨¹æÔò£¨Unified Build Rules£©Ö»¹Üÿ¸öCMakeLists.txtÎļþ¶¼ÓÐÆä×Ô¼ºµÄ¹¹½¨¹æÔòµ«ÎÒÃÇÓ¦¸ÃÖ»¹ÜʹÕâЩ¹¹½¨¹æÔò¼á³ÖÒ»ÖÂÕâÑù¿ÉÒÔʹÎÒÃǵĹ¹½¨Àú³ÌÔ½·¢¿ÉÕ¹ÍûÒ²Àû±ãÎÒÃǹÜÀíºÍά»¤ÎÒÃǵĹ¹½¨¹æÔò4.2.3 ʹÓÃCMakeµÄ°ü¹ÜÀí¹¦Ð§£¨Leveraging CMake¡¯s Package Management Features£©CMakeÌṩÁËһЩÏÂÁîºÍÌØÕ÷À´×ÊÖúÎÒÃǹÜÀíÏîÄ¿µÄÒÀÀµÀýÈçfind_package()ÏÂÁî¿ÉÒÔÓÃÀ´²éÕҺͼÓÔØÍⲿ¿âÎÒÃÇÓ¦¸ÃÖ»¹ÜʹÓÃÕâЩÏÂÁîºÍÌØÕ÷ÕâÑù¿ÉÒÔʹÎÒÃǵÄCMakeLists.txtÎļþÔ½·¢¾«Á·Ò²¿ÉÒÔ×èֹһЩ³£¼ûµÄÒÀÀµÎÊÌâ4.2.4 ×èÖ¹Ó²±àÂë·¾¶£¨Avoid Hard-Coded Paths£©ÔÚCMakeLists.txtÎļþÖÐÎÒÃÇÓ¦¸ÃÖ»¹Ü×èÖ¹Ó²±àÂë·¾¶Ó²±àÂëµÄ·¾¶¿ÉÄÜ»áʹÎÒÃǵĹ¹½¨Àú³ÌÒÀÀµÓÚÌØ¶¨µÄĿ¼½á¹¹Õâ»á½µµÍÎÒÃǵĹ¹½¨¹æÔòµÄ¿ÉÒÆÖ²ÐÔÏà·´ÎÒÃÇÓ¦¸Ã¾¡¿ÉÄܵØÊ¹ÓÃCMakeÌṩµÄ±äÁ¿ºÍÏÂÁîÀ´Ö¸¶¨Â·¾¶ÕâÑù¿ÉÒÔʹÎÒÃǵÄCMakeLists.txtÎļþÔ½·¢Í¨ÓúͿÉά»¤ÒÔÉϾÍÊÇÔÚÖØ´óÏîÄ¿ÖйÜÀí¶à¸öCMakeLists.txtÎļþµÄһЩսÂԺͽ¨ÒéÔÚÏÖʵӦÓÃÖÐÎÒÃÇ»¹ÐèҪƾ֤ÏîÄ¿µÄÏêϸÇéÐκÍÐèÇóÀ´µ÷½âºÍÓÅ»¯ÎÒÃǵĹÜÀíÕ½ÂÔ4.3 CMakeÔÚ´óÐÍÏîÄ¿ÖеÄ×î¼Ñʵ¼ù£¨Best Practices of CMake in Large Projects£©ÔÚ´óÐÍÏîÄ¿ÖÐʹÓÃCMakeÎÒÃÇÐèÒª×ñÕÕһЩ×î¼Ñʵ¼ùÒÔÈ·±£¹¹½¨Àú³ÌµÄ¸ßЧ¡¢Îȹ̺ͿÉά»¤ÒÔÏÂÊÇһЩÔÚ´óÐÍÏîÄ¿ÖÐʹÓÃCMakeµÄ×î¼Ñʵ¼ù4.3.1 ʹÓÃ×îа汾µÄCMake£¨Use the Latest Version of CMake£©¾¡¿ÉÄÜʹÓÃ×îа汾µÄCMakeа汾µÄCMakeͨ³ £»á°üÀ¨Ò»Ð©ÐµÄÌØÕ÷ºÍË¢ÐÂÕâÐ©ÌØÕ÷ºÍˢпÉÄÜ»áʹÎÒÃǵĹ¹½¨Àú³ÌÔ½·¢¸ßЧºÍÎȹ̱ðµÄа汾µÄCMakeÒ²¿ÉÄÜ»áÐÞ¸´Ò»Ð©¾É°æ±¾ÖеÄÎÊÌâºÍȱÏÝ4.3.2 ×èÖ¹ÔÚCMakeLists.txtÎļþÖÐÐ޸ıàÒëÆ÷±ê¼Ç£¨Avoid Modifying Compiler Flags in CMakeLists.txt Files£©ÔÚCMakeLists.txtÎļþÖÐÖ±½ÓÐ޸ıàÒëÆ÷±ê¼Ç¿ÉÄܻᵼÖÂһЩÎÊÌâÀýÈçÕâ¿ÉÄÜ»áÁýÕÖÓû§ÔÚÏÂÁîÐÐÖÐÖ¸¶¨µÄ±àÒëÆ÷±ê¼Ç»òÕßµ¼ÖÂÔÚ²î±ðƽ̨ÉϵĹ¹½¨ÐÐΪ·×ÆçÖÂÏà·´ÎÒÃÇÓ¦¸ÃʹÓÃCMakeÌṩµÄÏÂÁîºÍÌØÕ÷À´¹ÜÀí±àÒëÆ÷±ê¼ÇÀýÈçtarget_compile_options()ÏÂÁî4.3.3 ʹÓÃCMakeµÄ²âÊÔ¹¦Ð§£¨Use CMake¡¯s Testing Features£©CMakeÌṩÁËһЩÏÂÁîºÍÌØÕ÷À´×ÊÖúÎÒÃǹÜÀíºÍÔËÐвâÊÔÀýÈçenable_testing()ÏÂÁîºÍadd_test()ÏÂÁîÎÒÃÇÓ¦¸ÃÖ»¹ÜʹÓÃÕâЩÏÂÁîºÍÌØÕ÷ÕâÑù¿ÉÒÔʹÎÒÃǵIJâÊÔÀú³ÌÔ½·¢×Ô¶¯»¯ºÍ¿É¿Ø4.3.4 ʹÓÃCMakeµÄ×°Öù¦Ð§£¨Use CMake¡¯s Installation Features£©CMakeÌṩÁËһЩÏÂÁîºÍÌØÕ÷À´×ÊÖúÎÒÃǹÜÀíÏîÄ¿µÄ×°ÖÃÀú³ÌÀýÈçinstall()ÏÂÁîÎÒÃÇÓ¦¸ÃÖ»¹ÜʹÓÃÕâЩÏÂÁîºÍÌØÕ÷ÕâÑù¿ÉÒÔʹÎÒÃǵÄ×°ÖÃÀú³ÌÔ½·¢×Ô¶¯»¯ºÍ¿É¿ØÒÔÉϾÍÊÇÔÚ´óÐÍÏîÄ¿ÖÐʹÓÃCMakeµÄһЩ×î¼Ñʵ¼ùÔÚÏÖʵӦÓÃÖÐÎÒÃÇ»¹ÐèҪƾ֤ÏîÄ¿µÄÏêϸÇéÐκÍÐèÇóÀ´µ÷½âºÍÓÅ»¯ÎÒÃǵĹ¹½¨Àú³ÌÎå¡¢CMakeÌìÉúµÄMakefileÏê½â5.1 CMakeÔõÑù·­ÒëÌìÉúMakefileÔÚÉîÈëÃ÷È·CMakeÔõÑù·­ÒëÌìÉúMakefile֮ǰÎÒÃÇÊ×ÏÈÀ´¿´Ò»ÏÂCMakeÓëMakefileµÄ¹ØÏµÈçÏÂͼËùʾCMakeͨ¹ýÆÊÎöCMakeLists.txtÎļþÌìÉú¶ÔÓ¦µÄMakefileÈ»ºóÖ´ÐÐMakefile¾ÙÐбàÒëÁ´½Ó×îºóÌìÉú¿ÉÖ´ÐÐÎļþCMakeµÄÖ÷ÒªÊÂÇé¾ÍÊÇÆÊÎöCMakeLists.txtÎļþ²¢½«Æä·­Òë³ÉMakefileCMakeLists.txtÎļþÊÇCMakeµÄ½¹µãËü½ç˵ÁËÏîÄ¿µÄ¹¹½¨¹æÔò°üÀ¨ÏîÄ¿µÄĿ¼½á¹¹¡¢ÐèÒª±àÒëµÄÔ´Îļþ¡¢ÒÀÀµ¹ØÏµ¡¢±àÒë²ÎÊýµÈÐÅÏ¢CMakeͨ¹ý¶ÁÈ¡CMakeLists.txtÎļþÃ÷È·ÕâЩ¹¹½¨¹æÔòÈ»ºóÌìÉú¶ÔÓ¦µÄMakefileÔÚÌìÉúMakefileµÄÀú³ÌÖÐCMake»á¾ÙÐÐһϵÁеķ­Òë²Ù×÷ÕâЩ²Ù×÷Ö÷Òª°üÀ¨£ºÆÊÎöCMakeLists.txtÎļþ£ºCMakeÊ×ÏÈ»á¶ÁÈ¡CMakeLists.txtÎļþÆÊÎöÆäÖеÄÏÂÁîºÍ²ÎÊýÃ÷È·ÏîÄ¿µÄ¹¹½¨¹æÔòÌìÉúMakefile£ºÆ¾Ö¤ÆÊÎö»ñµÃµÄ¹¹½¨¹æÔòCMake»áÌìÉú¶ÔÓ¦µÄMakefileÕâ¸öMakefile°üÀ¨ÁËËùÓеıàÒëÁ´½ÓÏÂÁîÒÔ¼°Ô´ÎļþºÍÄ¿µÄÎļþÖ®¼äµÄÒÀÀµ¹ØÏµ´¦Öóͷ£ÒÀÀµ¹ØÏµ£ºÔÚÌìÉúMakefileµÄÀú³ÌÖÐCMake»á´¦Öóͷ£Ô´ÎļþÖ®¼äµÄÒÀÀµ¹ØÏµÈôÊÇÒ»¸öÔ´ÎļþÒÀÀµÓÚÁíÒ»¸öÔ´ÎļþÄÇôÔÚMakefileÖÐÕâ¸öÔ´ÎļþµÄ±àÒëÏÂÁî¾Í»áÒÀÀµÓÚÁíÒ»¸öÔ´ÎļþµÄ±àÒëÏÂÁîÉèÖñàÒë²ÎÊý£ºCMake»¹»áÉèÖÃMakefileÖеıàÒë²ÎÊý°üÀ¨±àÒëÆ÷Ñ¡Ïî¡¢Á´½ÓÆ÷Ñ¡ÏîµÈÕâЩ²ÎÊý»áÓ°Ïìµ½±àÒëÁ´½ÓµÄÀú³ÌÒÔÉϾÍÊÇCMakeÔõÑù·­ÒëÌìÉúMakefileµÄ»ù±¾Àú³ÌÔÚºóÐøµÄС½ÚÖÐÎÒÃǽ«ÉîÈë̽ÌÖMakefileµÄÏêϸ½á¹¹ºÍÔ­ÀíÒÔ¼°ÔõÑùÔÚCMakeÖÐʹÓÃÍⲿMakefileµÈ¸ß¼¶»°Ìâ5.2 MakefileµÄÏêϸÆÊÎöMakefileÊÇÓÉmake¹¤¾ßÖ´ÐеÄÒ»Ö־籾ÎļþËüÐÎòÁËÒ»×éÄ¿µÄ£¨target£©ÒÔ¼°¹¹½¨ÕâЩĿµÄËùÐèµÄ¹æÔò£¨rule£©ÔÚCMakeÌìÉúµÄMakefileÖÐÿһ¸öÄ¿µÄͨ³£¶ÔÓ¦Ò»¸ö»ò¶à¸öÔ´Îļþ¶ø¹æÔòÔòÐÎòÁËÔõÑù´ÓÕâЩԴÎļþÌìÉúÄ¿µÄÒÔÏÂÊÇÒ»¸ö¼òÆÓµÄMakefileʾÀý£ºall: hellohello: main.o function.o g++ main.o function.o -o hellomain.o: main.cpp g++ -c main.cppfunction.o: function.cpp g++ -c function.cppclean: rm *.o helloÔÚÕâ¸öʾÀýÖÐall¡¢hello¡¢main.o¡¢function.oºÍclean¶¼ÊÇÄ¿µÄ¶øÃ¿¸öÄ¿µÄºóÃæµÄÄÚÈÝÔòÊǹ¹½¨¸ÃÄ¿µÄµÄ¹æÔòÀýÈçhelloÄ¿µÄµÄ¹æÔòÊÇg++ main.o function.o -o helloÕâÌõ¹æÔò¸æËßmake¹¤¾ßÔõÑù´Ómain.oºÍfunction.oÕâÁ½¸öÔ´ÎļþÌìÉúhelloÕâ¸öÄ¿µÄÔÚCMakeÌìÉúµÄMakefileÖÐÕâЩ¹æÔò»áÔ½·¢ÖØ´óÓÉÓÚËüÃÇÐèÒª´¦Öóͷ£ÏîÄ¿ÖеÄÒÀÀµ¹ØÏµ¡¢±àÒë²ÎÊýµÈÎÊÌâ¿ÉÊÇ»ù±¾µÄ½á¹¹ºÍÔ­ÀíÊÇÏàͬµÄ£ºÃ¿¸öÄ¿µÄ¶¼ÓÐÒ»×鹿ÔòÕâЩ¹æÔòÐÎòÁËÔõÑù´ÓÔ´ÎļþÌìÉúÄ¿µÄ5.3 CMakeÔõÑù·­ÒëÌìÉúMakefileËäÈ»¿ÉÒÔÈÃÎÒÃǸüÉîÈëµØÌ½ÌÖһЩCMakeÏÂÁîºÍÌìÉúµÄMakefileÖ®¼äµÄ¹ØÏµadd_executable£ºÕâ¸öÏÂÁîÔÚCMakeÖÐÓÃÓÚ½ç˵һ¸öÄ¿µÄ¿ÉÖ´ÐÐÎļþÀýÈçadd_executable(hello main.cpp)»á½ç˵һ¸öÃûΪhelloµÄÄ¿µÄÕâ¸öÄ¿µÄÓÉmain.cppÕâ¸öÔ´ÎļþÌìÉúÔÚÌìÉúµÄMakefileÖÐÕâ¸öÏÂÁî»á±»·­Òë³ÉÒ»¸ö±àÒëÏÂÁîÈç$(CXX) $(CXXFLAGS) -o hello main.cppÕâÌõÏÂÁî¸æËßmake¹¤¾ßʹÓÃC++±àÒëÆ÷£¨( C X X ) £©ºÍ±àÒëÑ¡Ï (CXX)£©ºÍ±àÒëÑ¡Ï(CXX)£©ºÍ±àÒëÑ¡Ï(CXXFLAGS)£©À´±àÒëmain.cpp²¢½«Êä³öÎļþÃüÃûΪhelloadd_library£ºÕâ¸öÏÂÁîÔÚCMakeÖÐÓÃÓÚ½ç˵һ¸öÄ¿µÄ¿âÎļþÀýÈçadd_library(mylib mylib.cpp)»á½ç˵һ¸öÃûΪmylibµÄÄ¿µÄÕâ¸öÄ¿µÄÓÉmylib.cppÕâ¸öÔ´ÎļþÌìÉúÔÚÌìÉúµÄMakefileÖÐÕâ¸öÏÂÁî»á±»·­Òë³ÉÒ»¸ö¿âÌìÉúÏÂÁîÈç$(AR) $(ARFLAGS) mylib mylib.cppÕâÌõÏÂÁî¸æËßmake¹¤¾ßʹÓÿâÌìÉúÆ÷£¨( A R ) £©ºÍ¿âÌìÉúÑ¡Ï (AR)£©ºÍ¿âÌìÉúÑ¡Ï(AR)£©ºÍ¿âÌìÉúÑ¡Ï(ARFLAGS)£©À´ÌìÉúmylibÕâ¸ö¿âtarget_link_libraries£ºÕâ¸öÏÂÁîÔÚCMakeÖÐÓÃÓÚ½ç˵ĿµÄµÄÁ´½Ó¿âÀýÈçtarget_link_libraries(hello mylib)»á¸æËßCMakehelloÕâ¸öÄ¿µÄÐèÒªÁ´½ÓmylibÕâ¸ö¿âÔÚÌìÉúµÄMakefileÖÐÕâ¸öÏÂÁî»á±»·­Òë³ÉÒ»¸öÁ´½ÓÏÂÁîÈç$(CXX) $(LDFLAGS) -o hello main.cpp -lmylibÕâÌõÏÂÁî¸æËßmake¹¤¾ßÔÚÁ´½ÓhelloʱÐèÒªÁ´½ÓmylibÕâ¸ö¿âÒÔÉϾÍÊÇCMakeÏÂÁîºÍÌìÉúµÄMakefileÖ®¼äµÄһЩ»ù±¾¹ØÏµÔÚÏÖʵµÄÏîÄ¿ÖÐÕâЩ¹ØÏµ¿ÉÄÜ»á¸üÖØ´óÓÉÓÚCMakeºÍMakefile¶¼ÊǺÜÊÇǿʢµÄ¹¤¾ßËüÃÇÌṩÁËÐí¶à¸ß¼¶¹¦Ð§À´´¦Öóͷ£ÏîÄ¿ÖеÄÖÖÖÖÎÊÌâ¿ÉÊÇÃ÷È·ÕâЩ»ù±¾¹ØÏµÊÇÃ÷È·CMakeºÍMakefileµÄÒªº¦5.4 CMakeÌìÉúµÄMakefileÖеij£¼ûÎÊÌâ¼°½â¾ö¼Æ»®ÔÚʹÓÃCMakeÌìÉúMakefileµÄÀú³ÌÖпÉÄÜ»áÓöµ½Ò»Ð©³£¼ûµÄÎÊÌâÕâЩÎÊÌâ¿ÉÄÜÉæ¼°µ½MakefileµÄÌìÉú¡¢Ö´ÐС¢ÒÔ¼°ÒÀÀµ¹ØÏµµÄ´¦Öóͷ£µÈ·½ÃæÏÂÃæÎÒÃǽ«ÏêϸÏÈÈÝÕâЩÎÊÌâÒÔ¼°ÏìÓ¦µÄ½â¾ö¼Æ»®MakefileÌìÉúʧ°Ü£ºÕâÊÇÒ»¸ö½ÏÁ¿³£¼ûµÄÎÊÌâͨ³£ÊÇÓÉÓÚCMakeLists.txtÎļþÖеĹýʧµ¼ÖµÄ½â¾öÕâ¸öÎÊÌâµÄÒªÁìÊǼì²éCMakeLists.txtÎļþÈ·±£ÆäÖеÄÏÂÁîºÍ²ÎÊý¶¼ÊÇ׼ȷµÄMakefileÖ´Ðйýʧ£ºÕâ¸öÎÊÌâͨ³£ÊÇÓÉÓÚMakefileÖеÄÏÂÁî¹ýʧµ¼ÖµÄ½â¾öÕâ¸öÎÊÌâµÄÒªÁìÊǼì²éMakefileÈ·±£ÆäÖеıàÒëÁ´½ÓÏÂÁî¶¼ÊÇ׼ȷµÄÒÀÀµ¹ØÏµ´¦Öóͷ£¹ýʧ£ºÕâ¸öÎÊÌâͨ³£ÊÇÓÉÓÚCMake´¦Öóͷ£Ô´ÎļþÖ®¼äµÄÒÀÀµ¹ØÏµÊ±ÍÉ»¯µ¼ÖµÄ½â¾öÕâ¸öÎÊÌâµÄÒªÁìÊǼì²éCMakeLists.txtÎļþÈ·±£ÆäÖеÄÒÀÀµ¹ØÏµ¶¼ÊÇ׼ȷµÄÒÔÉϾÍÊÇÔÚʹÓÃCMakeÌìÉúMakefileʱ¿ÉÄÜÓöµ½µÄһЩ³£¼ûÎÊÌâÒÔ¼°ÏìÓ¦µÄ½â¾ö¼Æ»®ÔÚÏÖʵʹÓÃÖпÉÄÜ»¹»áÓöµ½ÆäËûµÄÎÊÌâÕâʱ¼äÐèҪƾ֤ÏêϸµÄ¹ýʧÐÅÏ¢¾ÙÐÐÏìÓ¦µÄÅŲéÏ¢Õù¾öÁù¡¢CMakeÓëÍⲿMakefileµÄ½»»¥£¨Interaction Between CMake and External Makefile£©6.1 ÔõÑùÔÚCMakeÖÐʹÓÃÍⲿMakefile£¨How to Use External Makefile in CMake£©ÔÚCMakeÖÐʹÓÃÍⲿMakefileÎÒÃÇ¿ÉÒÔʹÓÃadd_custom_commandºÍadd_custom_targetÕâÁ½¸öÏÂÁîÕâÁ½¸öÏÂÁî¿ÉÒÔÓÃÀ´Ö´ÐÐһЩ×Ô½ç˵µÄ¹¹½¨¹æÔòºÃ±ÈÔËÐÐÒ»¸ö¾ç±¾½¨ÉèÒ»¸öÎļþ»òÕßÔËÐÐÒ»¸öMakefile6.1.1 add_custom_commandadd_custom_commandÏÂÁîÓÃÓÚ½ç˵ÔõÑùÌìÉúÒ»¸öÎļþÕâ¸öÏÂÁîÓÐÐí¶à²ÎÊý¿ÉÊÇ×î³£ÓõÄÊÇOUTPUTCOMMANDºÍDEPENDSOUTPUT²ÎÊýÓÃÓÚÖ¸¶¨ÌìÉúµÄÎļþCOMMAND²ÎÊýÓÃÓÚÖ¸¶¨ÌìÉúÎļþµÄÏÂÁî¿ÉÒÔÊÇÈκÎshellÏÂÁîDEPENDS²ÎÊýÓÃÓÚÖ¸¶¨ÌìÉúÎļþËùÒÀÀµµÄÎļþÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´ÔËÐÐÒ»¸öÍⲿMakefile£ºadd_custom_command( OUTPUT $CMAKE_CURRENT_BINARY_DIR/generated_file COMMAND make -C $CMAKE_CURRENT_SOURCE_DIR/external_project DEPENDS $CMAKE_CURRENT_SOURCE_DIR/external_project/Makefile)Õâ¸öÏÂÁîÌåÏÖÈôÊÇgenerated_file²»±£´æ»òÕßexternal_project/MakefileÓÐÈκθ͝ÄÇô¾Í»áÖ´ÐÐmake -C external_projectÏÂÁîÀ´ÌìÉúgenerated_file6.1.2 add_custom_targetÈ»¶øadd_custom_commandÖ»ÓÐÔÚÆäÊä³öÎļþ±»ÆäËûÄ¿µÄʹÓÃʱ²Å»á±»Ö´ÐÐÈôÊÇÎÒÃÇÏëÒªÔÚÿ´Î¹¹½¨Ê±¶¼Ö´ÐÐij¸öÏÂÁîÄÇôÎÒÃÇÐèҪʹÓÃadd_custom_targetÏÂÁîadd_custom_targetÏÂÁîÓÃÓÚ½ç˵һ¸ö×Ô½ç˵µÄÄ¿µÄÕâ¸öÄ¿µÄ²»»áÌìÉúÈκÎÎļþÒ²²»»áÔÚ¹¹½¨Ê±×Ô¶¯±»Ö´ÐÐÎÒÃÇÐèÒªÊÖ¶¯Ö´ÐÐÕâ¸öÄ¿µÄ»òÕß½«ËüÌí¼ÓΪÆäËûÄ¿µÄµÄÒÀÀµÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´½ç˵һ¸öÔËÐÐÍⲿMakefileµÄÄ¿µÄ£ºadd_custom_target( run_external_makefile COMMAND make -C $CMAKE_CURRENT_SOURCE_DIR/external_project)Õâ¸öÏÂÁî½ç˵ÁËÒ»¸öÃûΪrun_external_makefileµÄÄ¿µÄÎÒÃÇ¿ÉÒÔʹÓÃmake run_external_makefileÏÂÁîÀ´ÊÖ¶¯Ö´ÐÐÕâ¸öÄ¿µÄÈôÊÇÎÒÃÇÏëÒªÔÚÿ´Î¹¹½¨Ê±¶¼Ö´ÐÐÕâ¸öÄ¿µÄÄÇôÎÒÃÇ¿ÉÒÔ½«ËüÌí¼ÓΪÆäËûÄ¿µÄµÄÒÀÀµÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´½«run_external_makefileÌí¼ÓΪmy_targetµÄÒÀÀµ£ºadd_dependencies(my_target run_external_makefile)ÕâÑùÿ´Î¹¹½¨my_targetʱ¶¼»áÏÈÖ´ÐÐrun_external_makefileÄ¿µÄÒÔÉϾÍÊÇÔõÑùÔÚCMakeÖÐʹÓÃÍⲿMakefileµÄ»ù±¾ÒªÁìÔÚÏÖʵʹÓÃÖÐÎÒÃÇ¿ÉÄÜÐèҪƾ֤ÏêϸµÄÐèÇóÀ´µ÷½âÕâЩÏÂÁîµÄ²ÎÊý6.1.3 add_custom_commandµÄÆäËû²ÎÊý³ýÁËOUTPUTCOMMANDºÍDEPENDS²ÎÊýÍâadd_custom_commandÏÂÁîÉÐÓÐһЩÆäËûµÄ²ÎÊý¿ÉÒÔÓÃÀ´¿ØÖÆÏÂÁîµÄÐÐΪWORKING_DIRECTORY²ÎÊýÓÃÓÚÖ¸¶¨ÃüÁîµÄÊÂÇéĿ¼ÈôÊDz»Ö¸¶¨Õâ¸ö²ÎÊýÄÇôÏÂÁîµÄÊÂÇéĿ¼¾ÍÊÇÄ¿½ñµÄ¹¹½¨Ä¿Â¼COMMENT²ÎÊýÓÃÓÚÖ¸¶¨Ò»¸ö×¢ÊÍÕâ¸ö×¢ÊÍ»áÔÚÏÂÁîÖ´ÐÐʱÏÔʾÔÚ¿ØÖÆÌ¨ÉÏVERBATIM²ÎÊýÓÃÓÚ¿ØÖÆÏÂÁîµÄ²ÎÊýÊÇ·ñÐèҪתÒåÈôÊÇÉèÖÃΪTRUEÄÇôÏÂÁîµÄ²ÎÊý¾Í»á±»×ªÒåÕâÑù¾Í¿ÉÒÔÇå¾²µØ´¦Öóͷ£°üÀ¨ÌØÊâ×Ö·ûµÄ²ÎÊýÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´ÔËÐÐÒ»¸öÍⲿMakefile²¢ÏÔʾһ¸ö×¢ÊÍ£ºadd_custom_command( OUTPUT $CMAKE_CURRENT_BINARY_DIR/generated_file COMMAND make -C $CMAKE_CURRENT_SOURCE_DIR/external_project DEPENDS $CMAKE_CURRENT_SOURCE_DIR/external_project/Makefile WORKING_DIRECTORY $CMAKE_CURRENT_BINARY_DIR COMMENT "Running external Makefile" VERBATIM)Õâ¸öÏÂÁîÌåÏÖÈôÊÇgenerated_file²»±£´æ»òÕßexternal_project/MakefileÓÐÈκθ͝ÄÇô¾Í»áÔÚ$CMAKE_CURRENT_BINARY_DIRĿ¼ÏÂÖ´ÐÐmake -C external_projectÏÂÁîÀ´ÌìÉúgenerated_file²¢ÏÔʾ"Running external Makefile"µÄ×¢ÊÍÒÔÉϾÍÊÇÔÚCMakeÖÐʹÓÃÍⲿMakefileµÄ»ù±¾ÒªÁìÔÚÏÖʵʹÓÃÖÐÎÒÃÇ¿ÉÄÜÐèҪƾ֤ÏêϸµÄÐèÇóÀ´µ÷½âÕâЩÏÂÁîµÄ²ÎÊý6.2 ÍⲿMakefileÔõÑùÓ°ÏìCMakeÌìÉúµÄMakefile£¨How External Makefile Affects Makefile Generated by CMake£©ÔÚCMakeÖÐÎÒÃÇ¿ÉÒÔͨ¹ýadd_custom_command»òadd_custom_targetÏÂÁîÀ´²åÈëÍⲿMakefile´Ó¶øÓ°ÏìCMakeÌìÉúµÄMakefileÏÂÃæÊÇÕâ¸öÀú³ÌµÄʾÒâͼ£º±à¼­Ìí¼ÓͼƬעÊͲ»Áè¼Ý 140 ×Ö£¨¿ÉÑ¡£©ÔÚÕâ¸öÀú³ÌÖÐCMakeÊ×ÏÈÆÊÎöCMakeLists.txtÎļþÌìÉúCMakeCache.txtÎļþÈ»ºóCMakeƾ֤CMakeCache.txtÎļþÌìÉúMakefileÔÚÌìÉúMakefileµÄÀú³ÌÖÐCMake»áÖ´ÐÐadd_custom_command»òadd_custom_targetÏÂÁî²åÈëÍⲿMakefile²åÈëÍⲿMakefileµÄÖ÷ҪĿµÄÊÇΪÁËÔöÌíһЩ×Ô½ç˵µÄ¹¹½¨¹æÔòÀýÈçÎÒÃÇ¿ÉÄÜÐèÒªÔÚ¹¹½¨Àú³ÌÖÐÖ´ÐÐÒ»Ð©ÌØÊâµÄÏÂÁî»òÕßÌìÉúÒ»Ð©ÌØÊâµÄÎļþͨ¹ý²åÈëÍⲿMakefileÎÒÃÇ¿ÉÒÔÔÚCMakeµÄ¹¹½¨Àú³ÌÖÐÖ´ÐÐÕâЩ×Ô½ç˵µÄ¹¹½¨¹æÔòÈ»¶ø²åÈëÍⲿMakefileÒ²¿ÉÄÜ»á´øÀ´Ò»Ð©ÎÊÌâÀýÈçÈôÊÇÍⲿMakefileÖеĹ¹½¨¹æÔòÓëCMakeÌìÉúµÄ¹¹½¨¹æÔò³åÍ»ÄÇô¿ÉÄܻᵼÖ¹¹½¨Ê§°ÜÒò´ËÔÚ²åÈëÍⲿMakefileʱÎÒÃÇÐèҪȷ±£ÍⲿMakefileÖеĹ¹½¨¹æÔòÓëCMakeÌìÉúµÄ¹¹½¨¹æÔòÊǼæÈݵÄÔÚÏÖʵʹÓÃÖÐÎÒÃÇ¿ÉÄÜÐèҪƾ֤ÏêϸµÄÐèÇóÀ´µ÷½â²åÈëÍⲿMakefileµÄ·½·¨ÀýÈçÎÒÃÇ¿ÉÒÔͨ¹ýÐÞ¸Äadd_custom_command»òadd_custom_targetÏÂÁîµÄ²ÎÊýÀ´¿ØÖÆÍⲿMakefileµÄ²åÈëλÖûòÕß¿ØÖÆÍⲿMakefileµÄÖ´Ðз½·¨6.3 ¸ß¼¶¼¼ÇÉ£º×ÔÓÉ¿ØÖÆCMakeÉúªϰÔò£¨Advanced Techniques: Freely Control CMake Generation Rules£©CMakeÌṩÁËһϵÁеÄÏÂÁî¿ÉÒÔÓÃÀ´×ÔÓÉ¿ØÖÆÉúªϰÔòÕâЩÏÂÁî¿ÉÒÔÓÃÀ´½ç˵×Ô½ç˵µÄÄ¿µÄÌí¼ÓÒÀÀµ¹ØÏµÉèÖñàÒëÑ¡ÏîµÈµÈÏÂÃæÎÒÃǽ«ÏÈÈÝһЩ¸ß¼¶µÄ¼¼ÇÉ¿ÉÒÔ×ÊÖúÄã¸üºÃµØ¿ØÖÆCMakeµÄÉúªϰÔò6.3.1 ×Ô½ç˵ĿµÄ£¨Custom Targets£©ÔÚCMakeÖÐÎÒÃÇ¿ÉÒÔʹÓÃadd_custom_targetÏÂÁîÀ´½ç˵һ¸ö×Ô½ç˵µÄÄ¿µÄÕâ¸öÄ¿µÄ²»»áÌìÉúÈκÎÎļþÒ²²»»áÔÚ¹¹½¨Ê±×Ô¶¯±»Ö´ÐÐÎÒÃÇÐèÒªÊÖ¶¯Ö´ÐÐÕâ¸öÄ¿µÄ»òÕß½«ËüÌí¼ÓΪÆäËûÄ¿µÄµÄÒÀÀµÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´½ç˵һ¸öÔËÐÐÍⲿMakefileµÄÄ¿µÄ£ºadd_custom_target( run_external_makefile COMMAND make -C $CMAKE_CURRENT_SOURCE_DIR/external_project)Õâ¸öÏÂÁî½ç˵ÁËÒ»¸öÃûΪrun_external_makefileµÄÄ¿µÄÎÒÃÇ¿ÉÒÔʹÓÃmake run_external_makefileÏÂÁîÀ´ÊÖ¶¯Ö´ÐÐÕâ¸öÄ¿µÄ6.3.2 Ìí¼ÓÒÀÀµ¹ØÏµ£¨Adding Dependencies£©ÔÚCMakeÖÐÎÒÃÇ¿ÉÒÔʹÓÃadd_dependenciesÏÂÁîÀ´Ìí¼ÓÄ¿µÄÖ®¼äµÄÒÀÀµ¹ØÏµÕâ¸öÏÂÁî½ÓÊÜÁ½¸ö»ò¸ü¶àµÄ²ÎÊýµÚÒ»¸ö²ÎÊýÊÇÄ¿µÄºóÃæµÄ²ÎÊýÊÇËüËùÒÀÀµµÄÄ¿µÄÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´½«run_external_makefileÌí¼ÓΪmy_targetµÄÒÀÀµ£ºadd_dependencies(my_target run_external_makefile)ÕâÑùÿ´Î¹¹½¨my_targetʱ¶¼»áÏÈÖ´ÐÐrun_external_makefileÄ¿µÄ6.3.3 ÉèÖñàÒëÑ¡ÏSetting Compilation Options£©ÔÚCMakeÖÐÎÒÃÇ¿ÉÒÔʹÓÃtarget_compile_optionsÏÂÁîÀ´ÉèÖÃÄ¿µÄµÄ±àÒëÑ¡ÏîÕâ¸öÏÂÁî½ÓÊÜÁ½¸ö²ÎÊýµÚÒ»¸ö²ÎÊýÊÇÄ¿µÄµÚ¶þ¸ö²ÎÊýÊDZàÒëÑ¡ÏîÀýÈçÎÒÃÇ¿ÉÒÔʹÓÃÒÔÏÂÏÂÁîÀ´Îªmy_targetÉèÖñàÒëÑ¡Ïtarget_compile_options(my_target PRIVATE -Wall -Wextra)Õâ¸öÏÂÁî»áΪmy_targetÌí¼Ó-WallºÍ-WextraÕâÁ½¸ö±àÒëÑ¡ÏîÒÔÉϾÍÊÇÔÚCMakeÖÐ×ÔÓÉ¿ØÖÆÉúªϰÔòµÄһЩ¸ß¼¶¼¼ÇÉÔÚÏÖʵʹÓÃÖÐÎÒÃÇ¿ÉÄÜÐèҪƾ֤ÏêϸµÄÐèÇóÀ´µ÷½âÕâЩÏÂÁîµÄ²ÎÊý

·½Ô´Ì¾ÁËÒ»¿ÚÎǶøÅÝÅÝÂêÌØµÄÊ×´´ÈËÍõÄþÒ²¿¿×ÅÕâ¿îÍæÅ¼Äê½ö37ËêÊÐÖµ¾ÍµÖ´ïÁË1500ÒÚ

¸üУº

2025-09-22 19:46:34

±¸×¢£º
¹úÓï
ÆÀ¼Û£º
¡¶97gangan¡·Ó°Ï·ÍêÕû°æÔÚÏßԢĿ-ƮѩӰÊÓ
Ê×Ò³
Ó°Ï·
Ò»Á¬¾ç
×ÛÒÕ
¶¯Âþ
APP
ÍøÕ¾µØÍ¼