ใช้ G ++ เพื่อรวบรวมไฟล์. cpp และ. h หลายไฟล์


172

ฉันเพิ่งได้รับรหัส C ++ ที่เขียนได้ไม่ดีกับไฟล์ cpp หนึ่งไฟล์ซึ่งมีฟังก์ชันหลักและฟังก์ชันอื่น ๆ นอกจากนี้ยังมี.hไฟล์ที่มีคลาสและคำจำกัดความของฟังก์ชั่น

g++ main.cppจนถึงขณะนี้โปรแกรมที่ถูกรวบรวมโดยใช้คำสั่ง ตอนนี้ฉันแยกชั้นเรียน.hและ.cppไฟล์ฉันจำเป็นต้องใช้ makefile หรือไม่ฉันยังสามารถใช้g++ main.cppคำสั่งได้หรือไม่

คำตอบ:


224

แสดงรายการไฟล์ cpp อื่นทั้งหมดหลังจาก main.cpp

กล่าวคือ

g++ main.cpp other.cpp etc.cpp

และอื่น ๆ

หรือคุณสามารถรวบรวมพวกมันทั้งหมดแยกกัน จากนั้นคุณลิงก์ไฟล์ ".o" ที่เป็นผลลัพธ์ทั้งหมดเข้าด้วยกัน


152
คุณสามารถทำได้g++ *.cpp -o output
rubenvb

7
นี่เป็นวิธีที่ไม่ดีหรือไม่? ฉันต้องการใช้สิ่งนี้ใน makefile ของฉัน
gabriel_vincent

8
@gabriel_vincent มันไม่จำเป็นต้องเป็นการฝึกฝนที่ไม่ดี แต่มันหมายความว่าการแก้ไขไฟล์หนึ่งไฟล์ในโปรเจคนับร้อยจะทำให้คอมไพเลอร์ทำซ้ำการทำงานทั้งหมดของไฟล์ทั้งหมด การคอมไพล์แยกต่างหากช่วยให้การคอมไพล์เพิ่มขึ้น
Paul Draper

@gabriel_vincent คุณไม่ควรเขียน makefiles ด้วยตนเองเพื่อเริ่มต้น ใช้ระบบสร้างที่เหมาะสมเช่น CMake แทน
Baum mit Augen

3
@BaummitAugen ใช่ยกเว้นฉันแค่ต้องการรวบรวมโปรแกรม 2 ไฟล์เล็ก ๆ ที่ฉันเขียนใน 14 นาทีและฉันชอบที่จะใช้เวลา 1 นาทีในการเขียน makefile แทนการตั้งค่าเวลาหนึ่งชั่วโมง
Przemek D

55

ในการรวบรวมโดยไม่ต้องเชื่อมโยงคุณต้องเพิ่ม-cตัวเลือก:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out

3
หมายเหตุหากคุณต้องการควบคุมชื่อของปฏิบัติการในขั้นตอนการเชื่อมโยงให้ทำในสิ่งที่คุณมักจะทำ:g++ -o my_executable myclass.o main.o
eric

22

ตอนนี้ฉันแยกชั้นเรียนเป็นไฟล์. h และ. cpp ฉันต้องใช้ makefile หรือฉันยังสามารถใช้คำสั่ง "g ++ main.cpp" ได้หรือไม่

การคอมไพล์ไฟล์หลายไฟล์พร้อมกันเป็นตัวเลือกที่แย่ถ้าคุณจะใส่เข้าไปใน Makefile

โดยปกติใน Makefile (สำหรับGNU / Make ) มันควรจะพอเขียน:

# "all" is name of the default target, running "make" without params would use it
all: executable1

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker
CC=$(CXX)

# tell which files should be used, .cpp -> .o make would do automatically
executable1: file1.o file2.o

วิธีmakeนั้นจะทำการคอมไพล์ซ้ำอย่างถูกต้องเฉพาะสิ่งที่ต้องทำการคอมไพล์ใหม่ นอกจากนี้ยังสามารถเพิ่ม tweaks สองสามรายการเพื่อสร้างการขึ้นต่อกันของไฟล์ส่วนหัว - ดังนั้นการสร้างจะสร้างสิ่งที่ต้องสร้างใหม่อย่างถูกต้องเนื่องจากการเปลี่ยนแปลงไฟล์ส่วนหัว


13

คุณยังสามารถใช้ g ++ ได้โดยตรงหากคุณต้องการ:

g++ f1.cpp f2.cpp main.cpp

โดยที่ f1.cpp และ f2.cpp เป็นไฟล์ที่มีฟังก์ชั่นในตัว สำหรับรายละเอียดของวิธีการใช้การแต่งหน้าที่จะทำสร้างให้ดูดีเอกสาร GNU แต่งหน้า


12

ฉันรู้ว่าคำถามนี้ถูกถามเมื่อหลายปีก่อน แต่ก็ยังต้องการแบ่งปันว่าฉันจะรวบรวมไฟล์ c ++ หลายไฟล์ได้อย่างไร

  1. สมมติว่าคุณมี 5 ไฟล์ CPP ทั้งหมดที่คุณต้องทำคือการใช้ * แทนการพิมพ์แต่ละไฟล์ CPP g++ -c *.cpp -o myprogramชื่อเช่น
  2. สิ่งนี้จะสร้าง "myprogram"
  3. เรียกใช้โปรแกรม ./myprogram

นั่นคือทั้งหมด !!

เหตุผลที่ฉันใช้ * คือถ้าคุณมีไฟล์ 30 cpp คุณจะพิมพ์ทั้งหมดหรือไม่ หรือเพียงแค่ใช้เครื่องหมาย * และประหยัดเวลา :)

ps ใช้วิธีนี้เฉพาะเมื่อคุณไม่สนใจ makefile


1
ข้อผิดพลาด Redefinition เกิดขึ้นเมื่อฉันใช้วิธีการนี้หรือไม่ มีวิธีทำแบบเดียวกันอีกไหม?
Waseem Ahmad Naeem

11

.h ไฟล์จะไม่เกี่ยวข้องกับการรวบรวม ... คุณสนใจเฉพาะไฟล์ cpp ... ดังนั้นให้พิมพ์ g++ filename1.cpp filename2.cpp main.cpp -o myprogram

หมายถึงคุณกำลังรวบรวมแต่ละไฟล์ CPP myprgramแล้วเชื่อมโยงเข้าด้วยกัน

จากนั้นเรียกใช้โปรแกรมของคุณ ./myprogram


7

ในฐานะrebenvpกล่าวว่าฉันใช้:

g++ *.cpp -o output

จากนั้นทำสิ่งนี้เพื่อผลลัพธ์:

./output

แต่ทางออกที่ดีกว่าคือการใช้makeไฟล์ อ่านที่นี่เพื่อทราบข้อมูลเพิ่มเติมเกี่ยวกับmakeไฟล์

นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณได้เพิ่ม.hไฟล์ที่จำเป็นใน.cppไฟล์


4

คุณสามารถใช้คำสั่ง g ++ หลาย ๆ อันแล้วเชื่อมโยง แต่วิธีที่ง่ายที่สุดคือใช้ Makefile แบบดั้งเดิมหรือระบบการสร้างอื่น ๆ : เช่น Scons (ซึ่งมักจะติดตั้งง่ายกว่า Makefiles)



1

ฉันเคยใช้ Makefile แบบกำหนดเองที่รวบรวมไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน แต่ฉันต้องคัดลอกในทุก ๆ ไดเรกทอรีที่ฉันต้องการทุกครั้ง

ดังนั้นฉันจึงสร้างเครื่องมือของตัวเอง - Universal Compilerซึ่งทำให้กระบวนการง่ายขึ้นมากเมื่อรวบรวมไฟล์จำนวนมาก


-4

~ / In_ProjectDirectory $ g ++ Coordin_main.cpp Coordin_func.cpp Coordin.h

~ / In_ProjectDirectory $ ./a.out

... ทำงาน !!

ใช้ Linux Mint กับ Geany IDE

เมื่อฉันบันทึกแต่ละไฟล์ไปยังไดเรกทอรีเดียวกันหนึ่งไฟล์ไม่ถูกบันทึกอย่างถูกต้องภายในไดเรกทอรี ไฟล์ประสานงาน ดังนั้นตรวจสอบอีกครั้งและบันทึกไว้ที่นั่นเป็นพิกัด เรื่องเล็ก ๆ น้อย ๆ Arg !!


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