การใช้ CMake เพื่อสร้างไฟล์โครงการ Visual Studio C ++


93

ฉันกำลังทำงานกับโปรเจ็กต์ C ++ โอเพ่นซอร์สสำหรับโค้ดที่คอมไพล์บน Linux และ Windows ฉันใช้ CMake เพื่อสร้างโค้ดบน Linux เพื่อความสะดวกในการตั้งค่าการพัฒนาและเหตุผลทางการเมืองฉันต้องยึดติดกับไฟล์ / ตัวแก้ไขโครงการ Visual Studio บน Windows (เช่นฉันไม่สามารถเปลี่ยนเป็นCode :: Blocksได้) ผมเห็นคำแนะนำในการสร้างไฟล์ Visual Studio ใช้ CMake เป็นที่นี่

คุณเคยใช้ CMake เพื่อสร้างไฟล์ Visual Studio มาก่อนหรือไม่? ประสบการณ์ของคุณเป็นอย่างไรบ้าง? สมมติว่าฉันต้องการเพิ่มไฟล์ใหม่ในโปรเจ็กต์ของฉัน ขั้นตอนการทำงานสำหรับสิ่งนี้คืออะไร?


1
สำหรับผู้ที่อยู่ใน GNU + Linux ที่พยายามสร้างไฟล์โครงการสำหรับ Visual Studio ซึ่งเป็น Windows โดยเฉพาะโปรดคำนึงถึงคำตอบนี้ TL; DR:เครื่องกำเนิดไฟฟ้าเป็นแพลตฟอร์มเฉพาะและคุณต้องอยู่ใน Windows เพื่อทำเช่นนั้น
code_dredd

คำตอบ:


57

CMake ค่อนข้างดีสำหรับเรื่องนี้ ส่วนสำคัญคือทุกคนในฝั่ง Windows ต้องจำไว้ว่าให้เรียกใช้ CMake ก่อนที่จะโหลดในโซลูชันและทุกคนในฝั่ง Mac ของเราจะต้องจำไว้ว่าต้องเรียกใช้ก่อนสร้าง

ส่วนที่ยากที่สุดคือในฐานะนักพัฒนา Windows ตรวจสอบให้แน่ใจว่าการเปลี่ยนแปลงโครงสร้างของคุณอยู่ในไฟล์ cmakelist.txt และไม่ได้อยู่ในไฟล์โซลูชันหรือโครงการเนื่องจากการเปลี่ยนแปลงเหล่านั้นอาจสูญหายและแม้ว่าจะไม่สูญหายก็จะไม่ถูกโอนไปยังฝั่ง Mac ที่ ยังต้องการพวกเขาและพวก Mac จะต้องจำไว้ว่าอย่าแก้ไขไฟล์ make ด้วยเหตุผลเดียวกัน

ต้องใช้ความคิดและความอดทนเล็กน้อย แต่จะมีข้อผิดพลาดในตอนแรก แต่ถ้าคุณใช้การบูรณาการอย่างต่อเนื่องทั้งสองด้านสิ่งเหล่านี้จะสั่นคลอนไปก่อนและในที่สุดผู้คนก็จะติดนิสัย


11
หากเป็นจริงเพียงครั้งเดียวก็จะไม่มีอีกต่อไป การเปลี่ยนแปลงใด ๆ ใน CMakeLists.txt จะทำให้เกิดการสร้างระบบบิลด์ใหม่ (ไฟล์โปรเจ็กต์สำหรับวิชวลสตูดิโอ makefiles ฯลฯ ) เวิร์กโฟลว์ภายใน Visual Studio เป็นสิ่งที่น่ารำคาญเนื่องจาก Visual Studio ไม่ได้สร้างไฟล์โครงการขึ้นมาใหม่เมื่อตรวจพบว่ามีการเปลี่ยนแปลง แต่จะรอให้คุณทำบิลด์ซึ่งทำให้กล่องโต้ตอบปรากฏขึ้นเนื่องจากต้องยกเลิกการสร้างเพื่อสร้างใหม่ - โหลดไฟล์โครงการ
Vitali

1
ข้อแม้คือคุณไม่จำเป็นต้องเรียกใช้คอมไพเลอร์ Visual Studio ผ่าน IDE คุณสามารถเรียกใช้บนบรรทัดคำสั่ง:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy

2
@PfunnyGuy cmake --build .ดูเพิ่มเติม
ย้อนหลัง

@ ขอบคุณมาก! cmake --build . --config Debug -- /nologo /verbosity:minimal /mที่จริงผมพบว่าและการใช้งาน ฉันจะแทรกหลังจาก. target run_testsเรียกใช้การทดสอบหน่วย googletest ของฉันและ "Debug" สามารถแทนที่ด้วย "Release" ได้ (การเพิ่มตัวเลือก config สำหรับ Debug เป็นทางเลือกเนื่องจากเป็นค่าเริ่มต้น แต่ฉันรวมไว้เพื่อแสดงว่าสามารถสลับกับ "Release" ได้อย่างไร)
PfunnyGuy

48

ไม่แน่ใจว่าเกี่ยวข้องโดยตรงกับคำถามหรือไม่ แต่ฉันกำลังมองหาคำตอบสำหรับวิธีสร้าง * .sln จากโครงการ cmake ที่ฉันค้นพบว่าสามารถใช้สิ่งนี้ได้:

cmake -G "Visual Studio 10"

ตัวอย่างสร้างไฟล์ VS 2010 ที่ต้องการจากไฟล์ CMakeLists.txt ที่ป้อนเข้า


1
ที่stackoverflow.com/questions/11269833/...จุด @Ivan เห็นว่าเรื่องนี้สามารถใส่ลงในไฟล์ PreLoad.cmake ในโฟลเดอร์เดียวกันเป็นระดับบนสุดของคุณ CMakeLists.txt cmakeและแล้วคุณก็สามารถทำได้
PfunnyGuy

25

เราย้ายสายการสร้างแผนกของเราไปที่ CMake และเรามี Roadbumps ภายในไม่กี่อย่างเนื่องจากแผนกอื่น ๆ ที่ใช้ไฟล์โครงการของเราและคุ้นเคยกับการนำเข้าไฟล์เหล่านี้ในโซลูชันของพวกเขา นอกจากนี้เรายังมีข้อร้องเรียนบางประการเกี่ยวกับ CMake ที่ไม่ได้รวมเข้ากับตัวจัดการโครงการ / โซลูชัน Visual Studio อย่างสมบูรณ์ดังนั้นจึงต้องเพิ่มไฟล์ไปยัง CMakeLists.txt ด้วยตนเอง นี่เป็นช่วงเวลาสำคัญในขั้นตอนการทำงานที่ผู้คนเคยชิน

แต่โดยทั่วไปแล้วมันเป็นการเปลี่ยนแปลงที่ค่อนข้างราบรื่น เรามีความสุขมากเพราะเราไม่ต้องจัดการกับไฟล์โครงการอีกต่อไป

ขั้นตอนการทำงานที่เป็นรูปธรรมสำหรับการเพิ่มไฟล์ใหม่ในโครงการนั้นง่ายมาก:

  1. สร้างไฟล์ตรวจสอบให้แน่ใจว่าอยู่ในตำแหน่งที่ถูกต้อง
  2. เพิ่มไฟล์ไปที่ CMakeLists.txt
  3. สร้าง.

CMake 2.6 จะรันซ้ำโดยอัตโนมัติหากไฟล์ CMakeLists.txt มีการเปลี่ยนแปลง (และ (กึ่ง) จะโหลดโซลูชัน / โปรเจ็กต์ใหม่โดยอัตโนมัติ

โปรดจำไว้ว่าหากคุณกำลังใช้งานบิลด์ที่ไม่อยู่ในแหล่งที่มาคุณต้องระวังอย่าสร้างไฟล์ต้นฉบับในไดเร็กทอรีบิลด์ (เนื่องจาก Visual Studio รู้เกี่ยวกับไดเร็กทอรีบิลด์เท่านั้น)


9

อย่างที่อเล็กซ์บอกมันใช้งานได้ดีมาก ส่วนที่ยุ่งยากเพียงอย่างเดียวคืออย่าลืมทำการเปลี่ยนแปลงใด ๆ ในไฟล์ cmake ไม่ใช่จากภายใน Visual Studio ดังนั้นในทุกแพลตฟอร์มเวิร์กโฟลว์จึงคล้ายกับว่าคุณใช้ makefiles แบบเก่าธรรมดา

แต่มันค่อนข้างง่ายที่จะใช้งานและฉันไม่มีปัญหากับ cmake ที่สร้างไฟล์ที่ไม่ถูกต้องหรืออะไรทำนองนั้นดังนั้นฉันจะไม่กังวลมากเกินไป


9

CMake สร้างโครงการ Visual Studio และโซลูชันได้อย่างราบรื่น คุณยังสามารถสร้างโครงการ / โซลูชันสำหรับ Visual Studio เวอร์ชันต่างๆได้โดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ กับไฟล์ CMake

การเพิ่มและการลบไฟล์ต้นฉบับเป็นเพียงเรื่องของการแก้ไขCMakeLists.txtซึ่งมีรายการไฟล์ต้นฉบับและสร้างโครงการ / โซลูชันขึ้นมาใหม่ แม้จะมีฟังก์ชัน globbing เพื่อค้นหาแหล่งข้อมูลทั้งหมดในไดเร็กทอรี (แต่ควรใช้ด้วยความระมัดระวัง)

ลิงก์ต่อไปนี้อธิบายพฤติกรรมเฉพาะของ CMake และ Visual Studio ได้เป็นอย่างดี

CMake และ Visual Studio


ลิงค์นั้นและโครงการตัวอย่างมีประโยชน์มากขอบคุณมาก! ฉันขอแนะนำให้รวมซอร์สโค้ดบางส่วนจากgithub repoไว้ในคำตอบของคุณตัวอย่างเช่นการระบุว่าโปรเจ็กต์ CMake เทียบเท่ากับโซลูชันและบางสิ่งเช่นadd_executableถูกใช้เพื่อเพิ่มสิ่งที่เทียบเท่ากับโปรเจ็กต์ Visual Studio
jrh

5

CMake สามารถสร้างดีจริงๆ Visual Studio .projs/ .slnsแต่มีปัญหาเสมอที่มีความจำเป็นในการปรับเปลี่ยน.cmakeไฟล์มากกว่า/.proj .slnในขณะนี้เรากำลังจัดการกับมันดังนี้:

  1. ไฟล์ต้นฉบับทั้งหมดไปที่/srcและไฟล์ที่มองเห็นได้ใน Visual Studio เป็นเพียง "ลิงก์" ที่กำหนดไว้ใน.filterไฟล์.
  2. โปรแกรมเมอร์เพิ่ม / ลบไฟล์ที่จำทำงานบน/srcไดเร็กทอรีที่กำหนดไม่ใช่โปรเจ็กต์เริ่มต้น
  3. เมื่อเสร็จแล้วเขาจะเรียกใช้สคริปต์ที่ "รีเฟรช" .cmakeไฟล์ที่เกี่ยวข้อง
  4. เขาตรวจสอบว่าโค้ดสามารถสร้างขึ้นในสภาพแวดล้อมที่สร้างขึ้นใหม่ได้หรือไม่
  5. เขายอมรับรหัส

ตอนแรกเรากลัวเล็กน้อยว่ามันจะออกมาอย่างไร แต่เวิร์กโฟลว์ทำงานได้ดีจริงๆและด้วยความแตกต่างที่ดีก่อนที่จะคอมมิตแต่ละครั้งทุกคนสามารถดูได้อย่างง่ายดายว่าการเปลี่ยนแปลงของเขาถูกแมปใน.cmakeไฟล์อย่างถูกต้องหรือไม่

สิ่งสำคัญอีกประการหนึ่งที่ควรทราบคือการขาดการสนับสนุน ( afaik ) สำหรับ "การกำหนดค่าโซลูชัน" ใน CMake ตามที่กล่าวมาคุณต้องสร้างไดเร็กทอรีสองไดเร็กทอรีพร้อมโปรเจ็กต์ / โซลูชัน - หนึ่งไดเร็กทอรีสำหรับบิวด์แต่ละประเภท (ดีบักรีลีส ฯลฯ ) ไม่มีการสนับสนุนโดยตรงสำหรับคุณสมบัติที่ซับซ้อนมากขึ้นกล่าวคือการสลับระหว่างการกำหนดค่าจะไม่ให้สิ่งที่คุณคาดหวัง


4
สำหรับ CMake 2.8.10 โซลูชันที่สร้างขึ้นมีการกำหนดค่าการสร้างแบบธรรมดา 4 แบบและมีการสนับสนุนสำหรับการกำหนดแบบกำหนดเองเพิ่มเติม
จอห์


0

ฉันได้เริ่มโครงการของตัวเองชื่อ syncProj ลิงค์เอกสาร / ดาวน์โหลดจากที่นี่:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

หากคุณวางแผนที่จะใช้ Visual studio ในการพัฒนาและปัจจุบันรองรับเฉพาะ C ++ เท่านั้น

ข้อได้เปรียบหลักเมื่อเทียบกับระบบการสร้างอื่น ๆ คือคุณสามารถดีบักสคริปต์ของคุณได้จริงเนื่องจากใช้ C #

หากคุณไม่คุ้นเคยกับ syncProj คุณสามารถแปลงโซลูชัน / โปรเจ็กต์ของคุณเป็นสคริปต์. cs และดำเนินการพัฒนาต่อจากจุดนั้นเป็นต้นไป

ใน cmake คุณจะต้องเขียนทุกอย่างตั้งแต่เริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.