<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="th">
	<id>https://theory.cpe.ku.ac.th/wiki/index.php?action=history&amp;feed=atom&amp;title=CMake%2FBasics</id>
	<title>CMake/Basics - ประวัติรุ่นแก้ไข</title>
	<link rel="self" type="application/atom+xml" href="https://theory.cpe.ku.ac.th/wiki/index.php?action=history&amp;feed=atom&amp;title=CMake%2FBasics"/>
	<link rel="alternate" type="text/html" href="https://theory.cpe.ku.ac.th/wiki/index.php?title=CMake/Basics&amp;action=history"/>
	<updated>2026-04-16T11:20:22Z</updated>
	<subtitle>ประวัติรุ่นแก้ไขของหน้านี้ในวิกิ</subtitle>
	<generator>MediaWiki 1.33.1</generator>
	<entry>
		<id>https://theory.cpe.ku.ac.th/wiki/index.php?title=CMake/Basics&amp;diff=8798&amp;oldid=prev</id>
		<title>Cardcaptor: หน้าที่ถูกสร้างด้วย &#039;CMake ([http://www.cmake.org/ http://www.cmake.org/] และ [http://en.wikipedia.org/wiki/Cmake http://en.wikipedia.org/wiki/Cmake])  …&#039;</title>
		<link rel="alternate" type="text/html" href="https://theory.cpe.ku.ac.th/wiki/index.php?title=CMake/Basics&amp;diff=8798&amp;oldid=prev"/>
		<updated>2010-05-09T22:18:41Z</updated>

		<summary type="html">&lt;p&gt;หน้าที่ถูกสร้างด้วย &amp;#039;CMake ([http://www.cmake.org/ http://www.cmake.org/] และ [http://en.wikipedia.org/wiki/Cmake http://en.wikipedia.org/wiki/Cmake])  …&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;หน้าใหม่&lt;/b&gt;&lt;/p&gt;&lt;div&gt;CMake ([http://www.cmake.org/ http://www.cmake.org/] และ [http://en.wikipedia.org/wiki/Cmake http://en.wikipedia.org/wiki/Cmake]) &lt;br /&gt;
เป็นซอฟต์แวร์สำหรับสร้าง build script (ไฟล์ที่นิยามวิธีการคอมไพล์และลิงก์โปรแกรมและไลบรารีที่เขียนด้วยภาษา C++) ที่สามารถใช้ร่วมกับเครื่องมือพัฒนาโปรแกรมที่ได้รับความนิยมหลายๆ ตัว&lt;br /&gt;
อาทิ Microsoft Visual C++, GNU Compiler Collection, Xcode, และ Eclipse CDT เป็นต้น&lt;br /&gt;
&lt;br /&gt;
การใช้ CMake ช่วยให้เรากำหนดซอฟต์แวร์ที่เราต้องการสร้างเพียงครั้งเดียว&lt;br /&gt;
หลังจากนั้นเราสามารถพัฒนามันโดยใช้เครื่องมือที่เราชอบบนแพลตฟอร์มใดๆ ก็ได้&lt;br /&gt;
CMake จึงอำนวยช่วยความสะดวกให้กับโปรแกรมเมอร์ภาษา C++ ที่ต้องการสร้างซอฟต์แวร์ที่รันบนหลายๆ &lt;br /&gt;
แพลตฟอร์มอย่างมาก ในบทความนี้เราจะกล่าวถึงวิธีการใช้งาน CMake จัดการซอฟต์แวร์โปรเจคง่ายๆ&lt;br /&gt;
เป็นการปูพื้นฐานก่อนจะกล่าวถึงการใช้งานที่สลับซับซ้อนขึ้นต่อไป&lt;br /&gt;
&lt;br /&gt;
== ปัญหาของการเขียนโปรแกรมสำหรับหลายแพลตฟอร์ม ==&lt;br /&gt;
&lt;br /&gt;
การเขียนโปรแกรมภาษา C++ ให้คอมไพล์และรันบนหลายๆ แพลตฟอร์ม (เขียนครั้งเดียวแต่รันได้ทั้งบน Windows, Unix, Mac, ฯลฯ)&lt;br /&gt;
นั่นเป็นเรื่องที่ทำให้โปรแกรมเมอร์ปวดเศียรเวียนเกล้าอย่างหนักมาหลายคนแล้ว เหตุก็เพราะว่า &lt;br /&gt;
แพลตฟอร์มต่างๆ กันนั้นมี &amp;quot;สภาพแวดล้อม&amp;quot; สำหรับพัฒนาโปรแกรมภาษา C++ ที่ไม่เหมือนกันเอาเสียเลย &lt;br /&gt;
เราอาจสามารถสรุปปัญหาที่โปรแกรมเมอร์เจอไว้เป็นข้อๆ ได้ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
# ไลบรารีภาษา C/C++ บนแพลตฟอร์มต่างๆ ไม่เหมือนกัน เช่น ใน Linux และ Mac จะมีไฟล์ unistd.h แต่ใน Windows ไม่มี หรือใน Mac มีระบบไลบรารีที่เรียกว่า [http://osxbook.com/book/bonus/ancient/whatismacosx/programming.html bundle และ framework] ซึ่งไม่ปรากฏอยู่ในแพลตฟอร์มอื่นๆ&lt;br /&gt;
# คอมไพเลอร์ที่ใช้เป็นคนละตัวกัน กล่าวคือ โปรแกรมเมอร์ C++ ใน Windows จะใช้ cl ของ Microsoft ส่วนโปรแกรมเมอร์บน Linux และ Mac จะใช้ gcc หรือ g++ ของ GNU Project นี่หมายความว่าภาษา C++ ใน Windows จะไม่เหมือนกับภาษา C++ ใน Unix และ Mac เป๊ะ และมีข้อแตกต่างยิบย่อยที่ทำให้ซอร์สโค้ดที่เขียนสำหรับแพลตฟอร์มหนึ่งไม่สามารถคอมไพล์บนอีกแพลตฟอร์มหนึ่งได้&lt;br /&gt;
# เครื่องมือที่ใช้ในการ build โปรแกรมไม่เหมือนกัน โปรแกรมเมอร์บน Windows จะใช้ Visual Studio พวกที่ใช้ Linux ก็จะเขียน Makefile แล้วรัน make ส่วนขา Mac ก็จะใช้ Xcode&lt;br /&gt;
&lt;br /&gt;
=== Preprocessor Macro ===&lt;br /&gt;
&lt;br /&gt;
เราสามารถหลีกเลี่ยงสองปัญหาแรกบางส่วนได้ด้วยการเขียน [http://en.wikipedia.org/wiki/Preprocessor_macro preprocessor macro]&lt;br /&gt;
เพื่อให้คอมไพเลอร์เลือกใช้โค้ดส่วนที่ถูกต้อง ยกตัวอย่าง เช่น หากเราต้องการชื่อของไดเรคทอรีที่โปรแกรมทำงานอยู่ในปัจจุบัน&lt;br /&gt;
(current working directory ย่อว่า cwd) แล้ว&lt;br /&gt;
&lt;br /&gt;
* ใน Linux และ Mac เราจะต้องใช้คำสั่ง getcwd ซึ่งอยู่ใน unistd.h&lt;br /&gt;
* แต่ใน Windows เราจะต้องใช้คำสั่ง _getcwd ซึ่งอยู่ใน direct.h&lt;br /&gt;
&lt;br /&gt;
เนื่องจาก cl จะนิยามมาโคร _WIN32 ก่อนคอมไพล์ไฟล์ทุกไฟล์ ดังนั้นเราสามารถเช็คได้ว่า&lt;br /&gt;
ตอนนี้โปรแกรมถูกคอมไพล์บน Windows หรือแพลตฟอร์มอื่นได้โดยการเช็คว่า _WIN32 ถูกนิยามหรือไม่&lt;br /&gt;
ฉะนั้นเราสามารถเลือก include ไฟล์ที่ถูกต้องได้ดังนี้&lt;br /&gt;
&lt;br /&gt;
&amp;lt;geshi lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifdef _WIN32&lt;br /&gt;
#include &amp;lt;direct.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/geshi&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ส่วนเวลาเรียกใช้คำสั่ง เราสามารถเขียนโค้ดต่อไปนี้ได้&lt;br /&gt;
&lt;br /&gt;
&amp;lt;geshi lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
char *buffer;&lt;br /&gt;
#ifdef _WIN32&lt;br /&gt;
buffer = _getcwd(NULL, 0);&lt;br /&gt;
#else&lt;br /&gt;
buffer = getcwd(NULL, 0);&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/geshi&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== เครื่องมือและสภาพแวดล้อมที่แตกต่าง ===&lt;br /&gt;
&lt;br /&gt;
อย่างไรก็ดีการเขียน preprocessor macro ก็ยังไม่สามารถแก้ปัญหาได้ทั้งหมด&lt;br /&gt;
เนื่องจากคอมไพเลอร์ของแต่ละแพลตฟอร์มมีวิธีการเรียกใช้และการกำหนดออปชันที่แตกต่างกัน&lt;br /&gt;
นอกจากนี้ การคอมไพล์โปรแกรมภาษา C++ เป็นกระบวนการที่ซับซ้อน &lt;br /&gt;
ดังนั้นแพลตฟอร์มต่างๆ จึงมีเครื่องมือสำหรับกำหนดกระบวนการนี้เป็นของตัวเอง&lt;br /&gt;
&lt;br /&gt;
ถึงแม้ว่าในปัจจุบัน [http://en.wikipedia.org/wiki/Make_%28software%29 make]&lt;br /&gt;
จะเป็นเครื่องมือมาตรฐานสำหรับการสร้างซอฟต์แวร์ภาษา C++ ในแพลตฟอร์มที่สืบเชื้อสายมาจาก&lt;br /&gt;
Unix ทั้งหลาย นอกจากนี้ใน Windows มี [http://msdn.microsoft.com/en-us/library/ms930369.aspx nmake]&lt;br /&gt;
ให้ใช้ด้วย อย่างไรก็ดีการใช้ make ทำให้โปรแกรมเมอร์ต้องสละความสะดวกสบายของ IDE&lt;br /&gt;
ที่ตนถนัด (เนื่องจากผู้เขียนใช้งาน Visual C++ จนติด การต้องไปเขียน Makefile เองจึงเป็นเรื่องที่ทรมานยิ่ง)&lt;br /&gt;
&lt;br /&gt;
แต่ปัญหาที่ใหญ่ที่สุดเกิดขึ้นเมื่อซอฟต์แวร์ที่เราสร้างใช้ไลบรารีภายนอกที่เราไม่ได้เขียนเอง&lt;br /&gt;
เนื่องจากแพลตฟอร์มต่างๆ มีที่เก็บไลบรารีที่แตกต่างกัน เช่น ใน Mac จะเก็บอยู่ในไดเรคทอรี&lt;br /&gt;
/Library ส่วนใน Unix อาจเก็บอยู่ที่ /usr หรือ /usr/local&lt;br /&gt;
ส่วนใน Windows นั้นไม่มีที่เก็บที่แน่นอน เป็นเรื่องของโปรแกรมเมอร์ที่จะต้องรู้ที่เก็บไลบรารีเอง&lt;br /&gt;
&lt;br /&gt;
ในแพลตฟอร์ม Unix มีชุดของเครื่องมือที่เรียกว่า [http://en.wikipedia.org/wiki/Autotools Autotools]&lt;br /&gt;
ซึ่งสามารถตรวจว่าระบบที่จะทำการคอมไพล์ไฟล์มีไลบรารีที่ต้องการให้ใช้หรือไม่&lt;br /&gt;
รวมทั้งสร้างไฟล์ชื่อ config.h ซึ่งมี preprocessor macro &lt;br /&gt;
ซึ่งช่วยให้เรา include ไฟล์และเลือกใช้คำสั่งที่ถูกต้องได้ดังที่กล่าวไว้ข้างบน&lt;br /&gt;
แต่การใช้ Autotools บังคับให้เราต้องใช้ make ไปโดยปริยาย&lt;br /&gt;
&lt;br /&gt;
ดังนั้นจึงการดีอย่างยิ่งหากเรามีเครื่องมือที่ช่วยให้เรากำหนดซอฟต์แวร์ที่เราต้องการสร้างเพียงครั้งเดียว&lt;br /&gt;
(ขั้นนี้เรียกว่าการทำ software project configuration และเพื่อความง่ายเราจะแทน &amp;quot;ซอฟต์แวร์ที่จะสร้าง&amp;quot;&lt;br /&gt;
ด้วยคำว่า &amp;quot;โปรเจค&amp;quot; แทน) แล้วอนุญาตให้เราสามารถคอมไพล์ซอฟต์แวร์นี้ด้วยเครื่องมืออะไรก็ได้ที่เราถนัดบนแพลตฟอร์มที่เราถนัด&lt;br /&gt;
แต่ในขณะเดียวกันเราก็ยังสามารถพัฒนาซอฟต์แวร์เดียวกันนี้บนแพลตฟอร์มอื่นได้ด้วย&lt;br /&gt;
&lt;br /&gt;
== CMake ==&lt;br /&gt;
&lt;br /&gt;
CMake เป็นเครื่องมือที่ช่วยตอบสนองความต้องการข้างต้นได้ จากมุมมองของผู้ใช้ &lt;br /&gt;
CMake แล้วกระบวนการคอมไพล์โปรแกรมสามารถแยกออกเป็นสามขั้นตอนดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
# เขียนไฟล์ชื่อ CMakeLists.txt เพื่อกำหนดโปรเจค&lt;br /&gt;
# รัน CMake เพื่อสร้าง build script ที่เฉพาะเจาะจงกับแพลตฟอร์มและเครื่องมือที่เราใชัพัฒนาโปรแกรม&lt;br /&gt;
# build โปรแกรมด้วยเครื่องมือดังกล่าว&lt;br /&gt;
&lt;br /&gt;
สังเกตว่าหน้าที่ของ CMake คือการอ่านพิมพ์เขียวของโปรเจคจากไฟล์ CMakeLists.txt&lt;br /&gt;
แล้วสร้าง build script แต่มันไม่ได้ทำการ build โปรแกรมด้วยตัวเองเหมือนกับเครื่องมือลักษณะคล้ายๆ กันตัวอื่น&lt;br /&gt;
นี่เป็นสาเหตุที่ทำให้เราสามารถใช้เครื่องมืออะไรก็ได้ที่ CMake สนับสนุนในการพัฒนาโปรแกรมตามความถนัดของเรา&lt;br /&gt;
&lt;br /&gt;
== การติดตั้ง CMake ==&lt;br /&gt;
&lt;br /&gt;
คุณสามารถดาวน์โหลด CMake จาก[http://www.cmake.org/cmake/resources/software.html หน้าดาวน์โหลดของเวบไซต์อย่างเป็นทางการ] &lt;br /&gt;
โดยเลือก installer ที่เหมาะสมกับแพลตฟอร์มที่คุณใช้&lt;br /&gt;
&lt;br /&gt;
ผู้ใช้ Debian หรือ Ubuntu สามารถติดตั้ง CMake ผ่าน apt-get ได้ด้วยการสั่ง&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; sudo apt-get cmake&lt;br /&gt;
&lt;br /&gt;
ส่วนผู้ใช้ Mac ที่ใช้ [http://www.macports.org/ MacPorts] สามารถติดตั้งได้โดยการสั่ง&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; sudo port install cmake&lt;br /&gt;
&lt;br /&gt;
หลังจากติดตั้งแล้วเราสามารถทดสอบว่า CMake ถูกติดตั้งเรียบร้อยดีหรือไม่ด้วยการสั่ง&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; cmake&lt;br /&gt;
&lt;br /&gt;
ใน command prompt ซึ่งหลังจากสั่งแล้วคุณควรจะพบว่า CMake พิมพ์วิธีการใช้มันอย่างคร่าวๆ&lt;br /&gt;
รวมทั้งออปชันต่างๆ ที่คุณสามารถกำหนดได้ออกมาทางหน้าจอ &lt;br /&gt;
โดยตอนท้ายของข้อความที่ CMake พิมพ์ออกมาจะมีส่วนที่กล่าวถึง &amp;quot;Generators&amp;quot;&lt;br /&gt;
ซึ่งบอกว่าขณะนี้ CMake สามารถสร้าง build script ที่ใช้กับเครื่องมือใดได้บ้าง&lt;br /&gt;
&lt;br /&gt;
เมื่อผู้เขียนรันคำสั่ง cmake บนภายใต้ระบบปฏิบัติการ Mac OSX แล้วได้ผลลัพธ์ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  cmake version 2.6-patch 4&lt;br /&gt;
  Usage&lt;br /&gt;
 &lt;br /&gt;
    cmake [options] &amp;lt;path-to-source&amp;gt;&lt;br /&gt;
    cmake [options] &amp;lt;path-to-existing-build&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  Options&lt;br /&gt;
    &amp;lt;&amp;lt;&amp;lt; ข้อความแสดงออปชันต่างๆ ที่ผู้ใช้สามารถกำหนดได้ &amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  Generators&lt;br /&gt;
 &lt;br /&gt;
  The following generators are available on this platform:&lt;br /&gt;
    Unix Makefiles               = Generates standard UNIX makefiles.&lt;br /&gt;
    Xcode                       = Generate XCode project files.&lt;br /&gt;
    CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.&lt;br /&gt;
    Eclipse CDT4 - Unix Makefiles&lt;br /&gt;
                                = Generates Eclipse CDT 4.0 project files.&lt;br /&gt;
    KDevelop3                   = Generates KDevelop 3 project files.&lt;br /&gt;
    KDevelop3 - Unix Makefiles   = Generates KDevelop 3 project files.&lt;br /&gt;
&lt;br /&gt;
แต่ถ้ารันมันภายใต้ Windows XP แล้วจะได้ผลลัพธ์ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  cmake version 2.8.1&lt;br /&gt;
  Usage&lt;br /&gt;
 &lt;br /&gt;
    cmake [options] &amp;lt;path-to-source&amp;gt;&lt;br /&gt;
    cmake [options] &amp;lt;path-to-existing-build&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  Options&lt;br /&gt;
    &amp;lt;&amp;lt;&amp;lt; ข้อความแสดงออปชันต่างๆ ที่ผู้ใช้สามารถกำหนดได้ &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  Generators&lt;br /&gt;
 &lt;br /&gt;
  The following generators are available on this platform:&lt;br /&gt;
    Borland Makefiles            = Generates Borland makefiles.&lt;br /&gt;
    MSYS Makefiles               = Generates MSYS makefiles.&lt;br /&gt;
    MinGW Makefiles              = Generates a make file for use with&lt;br /&gt;
                                  mingw32-make.&lt;br /&gt;
    NMake Makefiles              = Generates NMake makefiles.&lt;br /&gt;
    NMake Makefiles JOM          = Generates JOM makefiles.&lt;br /&gt;
    Unix Makefiles               = Generates standard UNIX makefiles.&lt;br /&gt;
    Visual Studio 10            = Generates Visual Studio 10 project files.&lt;br /&gt;
    Visual Studio 10 Win64      = Generates Visual Studio 10 Win64 project&lt;br /&gt;
                                  files.&lt;br /&gt;
    Visual Studio 6             = Generates Visual Studio 6 project files.&lt;br /&gt;
    Visual Studio 7             = Generates Visual Studio .NET 2002 project&lt;br /&gt;
                                  files.&lt;br /&gt;
    Visual Studio 7 .NET 2003   = Generates Visual Studio .NET 2003 project&lt;br /&gt;
                                  files.&lt;br /&gt;
    Visual Studio 8 2005        = Generates Visual Studio .NET 2005 project&lt;br /&gt;
                                  files.&lt;br /&gt;
    Visual Studio 8 2005 Win64  = Generates Visual Studio .NET 2005 Win64&lt;br /&gt;
                                  project files.&lt;br /&gt;
    Visual Studio 9 2008        = Generates Visual Studio 9 2008 project files.&lt;br /&gt;
    Visual Studio 9 2008 Win64  = Generates Visual Studio 9 2008 Win64 project&lt;br /&gt;
                                  files.&lt;br /&gt;
    Watcom WMake                = Generates Watcom WMake makefiles.&lt;br /&gt;
    CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.&lt;br /&gt;
    CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.&lt;br /&gt;
    CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.&lt;br /&gt;
    Eclipse CDT4 - MinGW Makefiles&lt;br /&gt;
                                = Generates Eclipse CDT 4.0 project files.&lt;br /&gt;
    Eclipse CDT4 - NMake Makefiles&lt;br /&gt;
                                = Generates Eclipse CDT 4.0 project files.&lt;br /&gt;
    Eclipse CDT4 - Unix Makefiles&lt;br /&gt;
                                = Generates Eclipse CDT 4.0 project files.&lt;br /&gt;
&lt;br /&gt;
ผลลัพธ์ทั้งสองแสดงให้เห็นว่าเราสามารถสร้าง build script สำหรับเครื่องมือที่แตกต่างกันได้หลายชนิด&lt;br /&gt;
และ CMake ยังรู้ด้วยว่าในแพลตฟอร์มต่างๆ กันมีเครื่องมือที่แตกต่างกัน&lt;br /&gt;
&lt;br /&gt;
== Hello World ด้วย CMake ==&lt;br /&gt;
&lt;br /&gt;
ในส่วนนี้เราจะทำการสร้างโปรแกรมที่ง่ายที่สุดด้วย CMake ก่อนอื่นให้คุณสร้างไดเรคทอรีชื่อ helloworld&lt;br /&gt;
ซึ่งมีโครงสร้างดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  helloworld/&lt;br /&gt;
      CMakeLists.txt&lt;br /&gt;
      main.cpp&lt;br /&gt;
&lt;br /&gt;
โดยที่ main.cpp มีเนื้อหาตามธรรมเนียมดังนี้&lt;br /&gt;
&lt;br /&gt;
&amp;lt;geshi lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() &lt;br /&gt;
{&lt;br /&gt;
  printf(&amp;quot;hello, world\n&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/geshi&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ไฟล์ CMakeLists.txt เป็นพิมพ์เขียวของโปรเจค ซึ่งในกรณีนี้มันมีเนื้อหาดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  PROJECT(sample)&lt;br /&gt;
  CMAKE_MINIMUM_REQUIRED(VERSION 2.6)&lt;br /&gt;
  &lt;br /&gt;
  ADD_EXECUTABLE(helloworld main.cpp)&lt;br /&gt;
&lt;br /&gt;
บรรทัดแรกของไฟล์บอกว่าโปรเจคของเรามีชื่อว่า sample ส่วนบรรทัดที่สองเป็นการเช็คว่า CMake &lt;br /&gt;
ที่เราใช้นั้นใหม่กว่าเวอร์ชัน 2.6 บรรทัดที่สามเป็นบรรทัดบอกว่าเราจะทำการสร้างไฟล์ executable&lt;br /&gt;
เพียงไฟล์เดียวชื่อ helloworld ด้วยการคอมไพล์ main.cpp&lt;br /&gt;
&lt;br /&gt;
ตอนนี้เราพร้อมที่จะสร้าง build script ด้วย CMake แล้ว &lt;br /&gt;
อันดับแรกให้ทำการเปลี่ยนไดเรคทอรีไปยังไดเรคทอรี helloworld ที่เราเพิ่งจะสร้างขึ้น&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; cd helloworld&lt;br /&gt;
&lt;br /&gt;
แล้วจึงสั่ง&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; cmake .&lt;br /&gt;
&lt;br /&gt;
เพื่อบอกให้ CMake สร้าง build script โดยอ่าน CMakeLists.txt จากไดเรคทอรีปัจจุบัน&lt;br /&gt;
การสั่งแบบนี้สอดคล้องกับการใช้ CMake โดยสั่ง&lt;br /&gt;
&lt;br /&gt;
  cmake [options] &amp;lt;path-to-source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ที่เราเคยเห็นแล้วจากการสั่ง cmake เปล่าๆ ข้างบน&lt;br /&gt;
&lt;br /&gt;
=== ผลลัพธ์ ===&lt;br /&gt;
&lt;br /&gt;
เนื่องจากเราไม่ได้กำหนดว่าจะให้ CMake ใช้ generator ตัวใด &lt;br /&gt;
CMake จึงเลือกใช้ generator ตัวที่ถูกเลือกเป็นตัวเลือกอัตโนมัติสำหรับแพลตฟอร์มที่เรารันมัน&lt;br /&gt;
&lt;br /&gt;
เวลาที่ผู้เขียนใช้ Mac ผู้เขียนพบว่า CMake จะสร้าง &amp;quot;Unix Makefiles&amp;quot;&lt;br /&gt;
ดังนั้นหากเราดูไฟล์ในไดเรคทอรี helloworld หล้งรัน CMake จะมีไฟล์ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; ls&lt;br /&gt;
  CMakeCache.txt     Makefile                main.cpp&lt;br /&gt;
  CMakeFiles         cmake_install.cmake&lt;br /&gt;
  CMakeLists.txt&lt;br /&gt;
&lt;br /&gt;
โดยไฟล์ที่เป็นผลลัพธ์ที่สำคัญที่สุดคือ Makefile ซึ่งทำให้เราสามารถสั่ง&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; make&lt;br /&gt;
&lt;br /&gt;
แล้วจะได้ไฟล์ executable ชื่อ helloworld ตามที่เราต้องการ&lt;br /&gt;
&lt;br /&gt;
ในทางกลับกัน ถ้าผู้เขียนใช้ Windows แล้ว CMake จะใช้ generator ชื่อ &amp;quot;Visual Studio 9 2008&amp;quot;&lt;br /&gt;
เพื่อสร้างไฟล์โปรเจคสำหรับ Visual C++ 2008 เมื่อผู้เขียนสำรวจดูไดเรคทอรี helloworld&lt;br /&gt;
ก็พบว่ามีไฟล์ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  C:\***\helloworld&amp;gt;dir&lt;br /&gt;
   Volume in drive C is ********&lt;br /&gt;
   Volume Serial Number is ****-****&lt;br /&gt;
 &lt;br /&gt;
   Directory of C:\***\helloworld&lt;br /&gt;
 &lt;br /&gt;
  05/08/2010  08:00 PM    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;
  05/08/2010  08:00 PM    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;
  05/08/2010  08:00 PM            23,520 ALL_BUILD.vcproj&lt;br /&gt;
  05/08/2010  08:00 PM            12,587 CMakeCache.txt&lt;br /&gt;
  05/08/2010  08:00 PM    &amp;lt;DIR&amp;gt;          CMakeFiles&lt;br /&gt;
  05/08/2010  07:57 PM                91 CMakeLists.txt&lt;br /&gt;
  05/08/2010  08:00 PM             1,473 cmake_install.cmake&lt;br /&gt;
  05/08/2010  08:00 PM            26,038 helloworld.vcproj&lt;br /&gt;
  05/08/2010  07:56 PM                92 main.cpp&lt;br /&gt;
  05/08/2010  08:00 PM             3,151 sample.sln&lt;br /&gt;
  05/08/2010  08:00 PM            20,415 ZERO_CHECK.vcproj&lt;br /&gt;
                 8 File(s)         87,367 bytes&lt;br /&gt;
                 3 Dir(s)   5,633,990,656 bytes free&lt;br /&gt;
&lt;br /&gt;
ซึ่งผู้เขียนสามารถใช้ Microsoft Visual Studio 2009 เปิดไฟล์ sample.sln&lt;br /&gt;
เพื่อคอมไพล์ main.cpp ให้กลายเป็น helloworld.exe ได้&lt;br /&gt;
&lt;br /&gt;
=== เลือก Generator เอง ===&lt;br /&gt;
&lt;br /&gt;
เราสามารถกำหนดให้ CMake ใช้ generator ตัวอื่นๆ ที่ไม่ใช้ตัวที่มันเลือกให้อัตโนมัติได้&lt;br /&gt;
ด้วยการใช้ออปชัน -G &amp;quot;ชื่อ generator&amp;quot; ยกตัวอย่างเช่น หากเราต้องการใช้ Xcode&lt;br /&gt;
ในการพัฒนาซอฟต์แวร์บนเครื่อง Mac แทนที่จะใช้ Unix Makefiles เราสามารถสั่ง&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; cmake -G &amp;quot;Xcode&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
แทนการสั่ง cmake . ที่กล่าวไปในส่วนที่แล้ว ในกรณีของโปรเจค sample ข้างบน &lt;br /&gt;
เราได้จะได้ไดเรคทอรีชื่อ sample.xcodeproj ซึ่งสามารถใช้ Xcode เปิดได้&lt;br /&gt;
&lt;br /&gt;
คุณสามารถชื่อของ generator ที่ใช้ได้ในแต่ละแพลตฟอร์มได้จากส่วน &amp;quot;Generators&amp;quot;&lt;br /&gt;
ของข้อความที่ CMake พิมพ์ออกมาเมื่อเราสั่ง cmake เฉยๆ ใน command prompt&lt;br /&gt;
&lt;br /&gt;
อย่างไรก็ดี หากคุณใช้สั่ง cmake . สร้าง build script ลงในไดเรคทอรี helloworld&lt;br /&gt;
เสร็จแล้วพยายามจะเปลี่ยน generator ที่ใช้ด้วยการสั่ง cmake -G &amp;quot;Xcode&amp;quot; . แล้ว&lt;br /&gt;
CMake จะบ่นว่า&lt;br /&gt;
&lt;br /&gt;
  CMake Error: Error: generator : Xcode&lt;br /&gt;
  Does not match the generator used previously: Unix Makefiles&lt;br /&gt;
  Either remove the CMakeCache.txt file or choose a different binary directory&lt;br /&gt;
&lt;br /&gt;
ปัญหานี้เกิดขึ้นจากข้อจำกัดของ CMake ที่ว่า ในไดเรคทอรีหนึ่งๆ มันสามารถสร้าง &lt;br /&gt;
build script ของเครื่องมือได้เพียงเครื่องมือเดียวเท่านั้น หากเราต้องการเปลี่ยนเครื่องมือใหม่&lt;br /&gt;
เราจะต้องทำให้ CMake &amp;quot;ลืม&amp;quot; build script ของเครื่องมือเดิมด้วยการลบไฟล์ CMakeCache.txt&lt;br /&gt;
แล้วจึงสั่ง cmake -G &amp;quot;Xcode&amp;quot; . ใหม่อีกรอบ หรือไม่ก็ไปสร้าง build script ในไดเรคทอรีใหม่เลย&lt;br /&gt;
&lt;br /&gt;
== In-Source Build และ Out-of-Source Build ==&lt;br /&gt;
&lt;br /&gt;
สังเกตว่าในการ build โปรเจค sample ในส่วนที่แล้วนั้น ได้เรคทอรี helloworld&lt;br /&gt;
บรรจุดทั้งซอร์สโค้ด (มีสองไฟล์คือ main.cpp และ CMakeLists.txt) และไฟล์อื่นๆ&lt;br /&gt;
ที่ CMake สร้างขึ้นไว้ทั้งคู่ การทำเช่นนี้เรียกว่าการทำ &amp;#039;&amp;#039;in-source build&amp;#039;&amp;#039;&lt;br /&gt;
และมันมีข้อเสียดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
1. ไดเรคทอรีที่เก็บซอร์สโค้ดสามารถเก็บ build script ของเครื่องมือได้เครื่องมือเดียวเท่านั้น&lt;br /&gt;
จึงเกิดความไม่สะดวกอย่างยิ่งเวลาต้องการสร้าง build script สำหรับเครื่องมือหลายๆ เครื่องมือ&lt;br /&gt;
&lt;br /&gt;
2. ไฟล์ของ CMake ปะปนกับไฟล์ซอร์สโค้ด ทำให้การจัดการซอร์สโค้ดทำได้ยากขึ้น&lt;br /&gt;
โดยเฉพาะเวลาที่เราเก็บซอร์สโค้ดโดยใช้ซอฟต์แวร์ version control &lt;br /&gt;
ซึ่งเราจะต้องคอยมาบอกระบุว่าไฟล์ไหนเป็นซอร์สโค้ด (ซึ่งต้องถูกเก็บใน version control)&lt;br /&gt;
และไฟล์ไหนเป็นไฟล์ที่ CMake สร้างขึ้น (ซึ่งไม่ควรถูกเก็บใน version control)&lt;br /&gt;
&lt;br /&gt;
ในทางกลับกัน &amp;#039;&amp;#039;out-of-source build&amp;#039;&amp;#039; คือการแยกไดเรคทอรีที่เก็บซอร์สโค้ด &lt;br /&gt;
(CMake เรียกไดเรคทอรีนี้ว่า &amp;#039;&amp;#039;source directory&amp;#039;&amp;#039;) และไดเรคทอรีที่เก็บ build script&lt;br /&gt;
และข้อมูลอื่นๆ (CMake เรียกไดเรคทอรีนี้ว่า &amp;#039;&amp;#039;binary directory&amp;#039;&amp;#039;) ให้เป็นคนละไดเรคทอรีกัน&lt;br /&gt;
การทำ  out-of-source build ช่วยให้เราหลีกเลี่ยงปัญหาข้างต้นทั้งสองข้อได้โดยสิ้นเชิง&lt;br /&gt;
โดยแลกมากับการจัดระเบียบวิธีการเก็บไฟล์ใหม่ &lt;br /&gt;
และการพิมพ์ค่ำสั่งเพิ่มอีกเล็กน้อยตอนเรียก CMake เท่านั้น&lt;br /&gt;
&lt;br /&gt;
=== จัดระเบียบไฟล์ใหม่ ===&lt;br /&gt;
&lt;br /&gt;
เราอาจจัดระเบียบไฟล์เพื่อทำ out-of-source build โดยเอาซอร์สโค้ดทั้งหมดไปใส่ไว้ในไดเรคทอรีชื่อ &lt;br /&gt;
src ซึ่งทำหน้าที่เป็น source directory และสร้างไดเรคทอรีว่างชื่อ build เพื่อทำหน้าที่เป็น&lt;br /&gt;
build directory ดังนั้นสำหรับโปรเจค sample เราอาจจัดระเบียบไฟล์ใหม่ดังต่อไปนี้&lt;br /&gt;
&lt;br /&gt;
  helloworld/&lt;br /&gt;
      build/&lt;br /&gt;
      src/&lt;br /&gt;
          CMakeLists.txt&lt;br /&gt;
          main.cpp&lt;br /&gt;
&lt;br /&gt;
=== เรียก CMake จาก build directory ===&lt;br /&gt;
&lt;br /&gt;
หลังจากนั้น เวลาเราจะสร้าง build script ก็ให้เปลี่ยนไดเรคทอรีไปยัง build:&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; cd helloworld/build&lt;br /&gt;
&lt;br /&gt;
แล้วจึงสั่ง cmake แล้วให้ source directory เป็น argument:&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; cmake ../src&lt;br /&gt;
&lt;br /&gt;
เมื่อสั่งแล้วไฟล์ build script ทุกอย่างจะถูกบรรจุอยุ่ใน build และเมื่อเราเรียก&lt;br /&gt;
make (สมมติว่าเราเขียนโปรแกรมอยู่บนเครื่อง Mac) แล้วเราจะได้ไฟล์ helloworld&lt;br /&gt;
อยู่ในไดเรคทอรี build ด้วย&lt;br /&gt;
&lt;br /&gt;
หลังจากที่เราสั่ง cmake โดยให้ source directory เป็น argument ไปเป็นครั้งแรกแล้ว&lt;br /&gt;
หากเราเข้าไปใน build directory อีกครั้งแล้วสั่ง cmake . อีกครั้ง CMake จะ update&lt;br /&gt;
ไฟล์ใน build directory ใหม่โดยใช้ generator ตัวเดิม ทำให้เราไม่ต้องพิมพ์ตำแหน่งของ&lt;br /&gt;
source directory อีกต่อไปเลย ทำให้เกิดความสะดวกขึ้นมาก&lt;br /&gt;
&lt;br /&gt;
=== สร้าง build script สำหรับเครื่องมือหลายๆ เครื่องมือ ===&lt;br /&gt;
&lt;br /&gt;
เราสามารถมี build directory ได้หลาย build directory ยกตัวอย่างเช่นหากเราต้องการใช้&lt;br /&gt;
Xcode ควบคู่ไปกับ Makefile เราอาจสร้างไดเรคทอรี helloworld/build_xcode และ&lt;br /&gt;
helloworld/build_make สำหรับเป็น build directory ของเครื่องมือทั้งสอง ตามลำดับ&lt;/div&gt;</summary>
		<author><name>Cardcaptor</name></author>
		
	</entry>
</feed>