วิธีการคอมไพล์และรัน C / C ++ ในเทอร์มินัล Unix console / Mac


144

ฉันจะรวบรวม / เรียกใช้ C หรือ C ++ ในคอนโซล Unix หรือเทอร์มินัล Mac ได้อย่างไร

(ฉันรู้ว่าลืมแล้วเรียนรู้อีกครั้งเวลาเขียนมัน)

คำตอบ:


188

หากเป็นโปรแกรมต้นฉบับอย่างง่าย:

make foo

ตำแหน่งที่ไฟล์ต้นฉบับคือ foo.c หรือ foo.cpp เป็นต้น

คุณไม่จำเป็นต้องมี makefile ด้วยซ้ำ Make มีกฎในตัวเพียงพอที่จะสร้างไฟล์ต้นฉบับของคุณลงในไฟล์เรียกทำงานที่มีชื่อเดียวกันคือส่วนขยายลบ

การเรียกใช้งาน executable ที่เพิ่งสร้างขึ้นนั้นเหมือนกับการรันโปรแกรมใด ๆ - แต่ส่วนใหญ่คุณจะต้องระบุพา ธ ไปที่ executable เพราะเชลล์จะค้นหาเฉพาะสิ่งที่อยู่ใน$PATHการค้นหา executables และส่วนใหญ่ไม่รวมไดเรกทอรีปัจจุบัน ( .)

ดังนั้นในการเรียกใช้ไฟล์ปฏิบัติการที่สร้างขึ้นfoo:

./foo

ฉันไม่ได้ตระหนักถึงกฎบิวด์อินที่แพร่กระจายไปยังเป้าหมายที่ระบุเมื่อทำการเรียกใช้ เรียนรู้สิ่งใหม่วันนี้ =)
Branan

"-bash: make: ไม่พบคำสั่ง" <- คุณต้องมีเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์และดาวน์โหลดส่วนประกอบเพิ่มเติม
dgig

17
มันไม่ได้แต่make main.cpp make main
Craig McMahon

@CraigMcMahon ขอบคุณสำหรับข้อมูลของคุณ!
Hlawuleka MAS

เรียนรู้สิ่งใหม่สิ่งนี้ยอดเยี่ยมมาก!
FossilizedCarlos

112
gcc main.cpp -o main.out  
./main.out

31
เป็น noob ฉันมีความโศกเศร้ามากที่ไม่รวมถึง "./" เมื่อดำเนินการ
funk-shun

2
@ funk-shun ฉันต้องการความคิดเห็นของคุณเป็นผลดีที่สุดเมื่อ googling สิ่งนี้ - พาฉันไปตลอดกาลเพื่อหาสิ่งนั้น (สำหรับ mac ของฉัน) - ขอบคุณ!
คอรีดับเบิลยู.

10
ฉันใช้ "gcc main.cpp -o main.out" และรับข้อผิดพลาดสัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64: "std :: __ 1 :: locale :: use_facet (std :: __ 1 :: locale :: id &) const" , ... ปรากฎเหตุผลคือ gcc default-links คือ libc ในขณะที่ใช้ g ++ จะเชื่อมโยงกับ libstdc ++ ดังนั้นใช้ "g ++ main.cpp -o main.out" อาจจะดีกว่า
ราเชล

1
@ ราเชลฉันก็ประสบปัญหาเดียวกัน
Goldname

1
เกี่ยวกับUndefined symbols for architecture x86_64 ปัญหาฉันแก้ไขคำสั่งดังต่อไปนี้: gcc -lstdc++ main.cpp -o main.outและใช้งานได้บน Mac ของฉัน ผ่านทางลิงค์: stackoverflow.com/questions/11852568/…
rotoava

69

นี่คือคำสั่งที่ใช้กับเครื่อง Unix ทั้งหมด ... ฉันใช้มันบน Linux / Ubuntu แต่ใช้งานได้ใน OS X เช่นกัน พิมพ์คำสั่งต่อไปนี้ในTerminal.app

$ g++ -o lab21 iterative.cpp

-o เป็นตัวอักษร O ไม่เป็นศูนย์

lab21 จะเป็นไฟล์ปฏิบัติการของคุณ

iterative.cpp คือไฟล์ c ++ ของคุณ

หลังจากที่คุณเรียกใช้คำสั่งนั้นให้พิมพ์คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อเรียกใช้โปรแกรมของคุณ:

$ ./lab21

1
นี่คือสิ่งที่ได้ผลสำหรับฉัน ฉันลองใช้วิธีแก้ไขปัญหาอื่นด้านบนโดยไม่มีโชค ขอบคุณ!
nmrichards

ทำงานให้ฉันเช่นกันไม่จำเป็นต้องติดตั้งอะไรเลยทางออกที่สมบูรณ์แบบ
Chander Shakher Ghorela - ปราชญ์

33

สองขั้นตอนสำหรับฉัน:

ครั้งแรก:

make foo

แล้ว:

./foo

1
./fooดูนโน่ว่าคำตอบที่ได้รับการยอมรับนั้นไม่มีคำสั่งที่สำคัญชิ้นนี้
ซูฮาบ

@Suhaib คำตอบที่ฉันยอมรับไม่มีส่วนคำสั่งนั้นเพราะคำถามดั้งเดิมไม่ได้ถาม มันมีชื่อว่า "วิธีรัน C / C ++ ในคอนโซล Unix / เทอร์มินัล Mac" - ซึ่งฉันตีความว่าเป็น "วิธีเรียกใช้คอมไพเลอร์ c / c ++" เปลี่ยนชื่อเป็น "คอมไพล์และเรียกใช้" ในภายหลัง ฉันได้อัปเดตคำตอบเพื่อให้สอดคล้องกับคำถามที่เปลี่ยนไป
camh

15

การประมวลผลแอปพลิเคชันทั้งหมดในสภาพแวดล้อม Unix (Linux, Mac OS X, AIX ฯลฯ ) ขึ้นอยู่กับพา ธ การค้นหาที่เรียกใช้งานได้

คุณสามารถแสดงพา ธ นี้ในเทอร์มินัลด้วยคำสั่งนี้:

echo $ PATH

ใน Mac OS X (โดยค่าเริ่มต้น) สิ่งนี้จะแสดงเส้นทางการค้นหาที่คั่นด้วยโคลอนต่อไปนี้:

/ usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin

ดังนั้นความสามารถในการประมวลผลใด ๆ ในไดเรกทอรีที่ระบุสามารถเรียกใช้ได้โดยพิมพ์ชื่อ ตัวอย่างเช่น:

cat mytextfile.txt

สิ่งนี้ทำงาน /bin/catและแสดง mytextfile.txt ไปยังเทอร์มินัล

ในการรันคำสั่งอื่น ๆ ที่ไม่ได้อยู่ในพา ธ การค้นหาที่สามารถเรียกทำงานได้คุณจะต้องมีคุณสมบัติพา ธ ไปยังไฟล์ปฏิบัติการได้ ดังนั้นว่าฉันมีปฏิบัติการที่เรียกว่า MyProgram ในไดเรกทอรีบ้านของฉันบน Mac OS XI สามารถมีคุณสมบัติครบถ้วนเช่น:

/ ผู้ใช้ / โอลิเวอร์ / MyProgram

หากคุณอยู่ในตำแหน่งที่อยู่ใกล้กับโปรแกรมที่คุณต้องการเรียกใช้คุณสามารถรับรองชื่อด้วยพา ธ บางส่วน ตัวอย่างเช่นถ้าMyProgramอยู่ในไดเรกทอรี/Users/oliver/MyProjectI และฉันอยู่ในโฮมไดเรกทอรีของฉันฉันสามารถผ่านการรับรองชื่อปฏิบัติการเช่นนี้และมีการดำเนินการ:

MyProject / MyProgram

หรือว่าฉันอยู่ในไดเรกทอรี/Users/oliver/MyProject2และฉันต้องการที่จะรัน/Users/oliver/MyProject/MyProgramฉันสามารถใช้เส้นทางสัมพัทธ์เช่นนี้เพื่อรันมัน:

../MyProject/MyProgram

ในทำนองเดียวกันถ้าฉันอยู่ในไดเรกทอรีเดียวกันกับ MyProgramฉันต้องใช้เส้นทางสัมพัทธ์ "ไดเรกทอรีปัจจุบัน" ไดเรกทอรีปัจจุบันที่คุณอยู่คืออักขระเครื่องหมายจุดตามด้วยเครื่องหมายทับ ตัวอย่างเช่น:

./MyProgram

เพื่อกำหนดไดเรกทอรีที่คุณใช้งานอยู่ในปัจจุบัน pwdคำสั่ง

หากคุณมักจะวางโปรแกรมไว้ในฮาร์ดดิสก์ที่คุณต้องการเรียกใช้โดยไม่ต้องมีคุณสมบัติของชื่อ ตัวอย่างเช่นหากคุณมีไดเรกทอรี "bin" ในไดเรกทอรีภายในบ้านของคุณสำหรับเชลล์สคริปต์ที่ใช้เป็นประจำของโปรแกรมอื่น ๆ คุณควรเปลี่ยนพา ธ การค้นหาที่เรียกใช้งานได้

สิ่งนี้สามารถทำได้อย่างง่ายดายโดยการสร้างหรือแก้ไข.bash_profileไฟล์ที่มีอยู่ในโฮมไดเรกทอรีของคุณและเพิ่มบรรทัด:

#!/bin/sh
export PATH=$PATH:~/bin

นี่คือการใช้อักขระ tilde (~) เป็นทางลัดสำหรับ / Users / oliver นอกจากนี้โปรดทราบว่าบรรทัด hash bang (#!) ต้องเป็นบรรทัดแรกของไฟล์ (หากยังไม่มีอยู่) โปรดทราบว่าเทคนิคนี้ต้องการให้เชลล์ล็อกอินของคุณทุบตี (ค่าเริ่มต้นใน Mac OS X และการแจกแจง Linux ส่วนใหญ่) นอกจากนี้โปรดทราบว่าหากคุณต้องการให้โปรแกรมของคุณติดตั้งไว้~/binเพื่อใช้ในการกำหนดค่าตามความต้องการสำหรับระบบปฏิบัติการคุณควรจัดลำดับคำสั่งส่งออกใหม่ดังนี้

export PATH=~/bin:$PATH

หากคุณเพิ่มความคิดเห็นจาก 'onebyone.livejournal.com' ในคำตอบของฉันเองเกี่ยวกับความปลอดภัยคำตอบนี้เสร็จสมบูรณ์ ขอบคุณ.
PA

10

ไรอันฉันกำลังเปลี่ยนสิ่งนี้เป็นคำตอบแทนที่จะเป็นความคิดเห็นเพราะดูเหมือนว่าฉันสั้นเกินไป ทำทั้งหมดนี้ใน "เทอร์มินัล"

ในการใช้คอมไพเลอร์ G ++ คุณต้องทำสิ่งนี้:

  1. นำทางไปยังไดเร็กทอรีที่คุณเก็บไฟล์ * .cpp

    cd ~/programs/myprograms/
    (~ เป็นทางลัดสำหรับบ้านของคุณเช่น / Users / Ryan / programs / myprograms / แทนที่ด้วยตำแหน่งที่คุณใช้งานจริง)

  2. รวบรวมมัน

    g++ input.cpp -o output.bin (output.bin สามารถเป็นอะไรก็ได้ที่มีส่วนขยายใด ๆ จริงๆแล้ว bin เป็นเรื่องปกติในยูนิกซ์)

    ไม่ควรมีการส่งคืนหากประสบความสำเร็จและไม่เป็นไรโอเคโดยทั่วไปคุณจะได้รับผลตอบแทนจากความล้มเหลว

    อย่างไรก็ตามหากคุณพิมพ์lsคุณจะเห็นรายการไฟล์ในไดเรกทอรีเดียวกัน ตัวอย่างเช่นคุณจะเห็นโฟลเดอร์อื่น ๆ input.cpp และ output.bin

  3. จากภายในไดเรกทอรีตอนนี้รันด้วย ./outbut.bin


ขอบคุณสิ่งนี้ได้ผล คุณจะรู้บทเรียนที่จะอธิบายสิ่งเหล่านี้หรือไม่? เช่นเดียวกับสิ่งที่ G ++ หมายถึงอะไรสวิตช์ 'o' คืออะไรและสิ่งอื่น ๆ ที่อาจเกิดขึ้น?
Ryan

เพิ่มความคิดเห็นเกี่ยวกับวิธีการmakeทำงานเพราะไม่มี makefile

ไรอันคุณสามารถพิมพ์ "man g ++" ในเทอร์มินัลเพื่อรับ "man pages" (เช่นคู่มือซึ่งฉันคิดว่า Apple ฝังไว้) ฉันไม่เคยเห็นแบบฝึกหัดที่ยอดเยี่ยมมาก่อน แม้ว่าหน้า man บน g ++ อาจมีความลึกในเชิงลึกด้วย CFLAGS และตัวเลือกการรวบรวมขั้นสูงทุกประเภท
nerdwaller

Nitpick: "ควรมีอะไร [พิมพ์] ถ้ามันประสบความสำเร็จและไม่เป็นไรโดยทั่วไปคุณได้รับ [ผลลัพธ์] เมื่อเกิดความล้มเหลว" จะมีค่าส่งคืน 0 เมื่อสำเร็จไม่เป็น 0 สำหรับความล้มเหลว
sepp2k

ผสานจากstackoverflow.com/questions/13714436/ (พยายามรวบรวมคำแนะนำพื้นฐานสำหรับเรื่องนี้)
Shog9

9

วิธีกะทัดรัดในการดำเนินการดังกล่าวอาจเป็น:

make foo && ./$_

ยินดีที่จะมีหนึ่งซับเพื่อให้คุณสามารถเรียกใช้ปฏิบัติการของคุณอีกครั้งได้อย่างง่ายดาย


8

สมมติว่าไดเรกทอรีปัจจุบันไม่ได้อยู่ในเส้นทางไวยากรณ์คือ ./[name of the program]สมมติว่าไดเรกทอรีปัจจุบันไม่ได้อยู่ในเส้นทางไวยากรณ์คือ

ตัวอย่างเช่น ./a.out


2
ดีสำหรับคุณ! จุดและสแลชนั้นมีอยู่เพราะในหลาย ๆ ระบบไดเรกทอรีปัจจุบัน ("." ในเทอม Unix) ไม่ได้เป็นส่วนหนึ่งของพา ธ ที่ค้นพบโดยเชลล์ ดังนั้นการเพิ่มมันทำให้ชัดเจนว่าคุณต้องการเรียกใช้โปรแกรมใด
ผ่อนคลาย

7

เพิ่มการติดตามเพื่อรับคำเตือนที่ดีที่สุดคุณจะไม่เสียใจ หากทำได้ให้รวบรวม WISE (คำเตือนคือข้อผิดพลาด)

- Wall -pedantic -Weffc++ -Werror

ควรเป็นค่าเริ่มต้นจริง ๆ
Konrad Rudolph

6

ในการรวบรวมโปรแกรม C หรือ C ++ มีคำสั่งทั่วไป:

  1. make filename

  2. ./filename

make จะสร้างซอร์สไฟล์ของคุณเป็นไฟล์เรียกทำงานที่มีชื่อเดียวกัน แต่ถ้าคุณต้องการใช้วิธีมาตรฐานคุณสามารถใช้คอมไพเลอร์ gcc เพื่อสร้างโปรแกรม C & g ++ สำหรับ c ++

สำหรับ C:

gcc filename.c

./a.out

สำหรับ C ++:

g++ filename.cpp

./a.out

2

makefileการใช้งาน แม้สำหรับโครงการขนาดเล็กมาก (= หนึ่งไฟล์) ความพยายามอาจคุ้มค่าเพราะคุณสามารถมีการตั้งค่าคอมไพเลอร์หลายชุดเพื่อทดสอบสิ่งต่างๆ การดีบักและการปรับใช้ทำได้ง่ายขึ้นด้วยวิธีนี้

อ่านmakeคู่มือดูเหมือนว่าจะค่อนข้างนานในแวบแรก แต่ส่วนใหญ่คุณสามารถเรียดไป โดยรวมแล้วฉันใช้เวลาไม่กี่ชั่วโมงและทำให้ฉันมีประสิทธิภาพมากขึ้น


ขอบคุณนั่นเป็นคำตอบที่ดีเช่นกัน ฉันพยายามใช้ make as mush เท่าที่จะทำได้และนั่นก็เป็นเหตุผลที่ทำให้ฉันลืมไวยากรณ์ของวิธี "ง่าย ๆ "
PA


2

เพียงแค่ใส่ในไดเรกทอรีซึ่งเป็นไฟล์ c / cpp ของคุณ

สำหรับการคอมไพล์และรันโค้ด c

$gcc filename.c
$./a.out filename.c

สำหรับการคอมไพล์และรันโค้ด c ++

$g++ filename.cpp
$./a.out filename.cpp

"$" เป็นสัญลักษณ์ terminal Mac เริ่มต้น


2

ในการรวบรวมและเรียกใช้ cpp ซอร์สโค้ดจากเทอร์มินัล Mac จำเป็นต้องทำดังต่อไปนี้

  1. หากพา ธ ของไฟล์ cpp คือ somePath / fileName.cpp อันดับแรกให้ไปที่ไดเร็กทอรีที่มีพา ธ somePath
  2. ในการรวบรวม fileName.cpp พิมพ์ c ++ fileName.cpp -o fileName
  3. หากต้องการเรียกใช้โปรแกรมให้พิมพ์. / ชื่อไฟล์

0

การเรียกใช้ไฟล์. C โดยใช้เทอร์มินัลเป็นกระบวนการสองขั้นตอน ขั้นตอนแรกคือพิมพ์ gcc ในเทอร์มินัลแล้วปล่อยไฟล์. C ไปยังเทอร์มินัลแล้วกดEnter:

username$ gcc /Desktop/test.c 

ในขั้นตอนที่สองเรียกใช้คำสั่งต่อไปนี้:

username$ ~/a.out

0

สำหรับการรันไฟล์ c ++ รันคำสั่งด้านล่างชื่อไฟล์สมมติว่าเป็น "main.cpp"

1. คอมไพล์เพื่อสร้างออบเจ็กต์ไฟล์จากไฟล์ c ++

g++ -c main.cpp -o main.o

2. ตั้งแต่#include <conio.h>ไม่สนับสนุนใน MacOS ดังนั้นเราจึงควรใช้ทางเลือกที่สนับสนุนใน Mac #include <curses.h>ที่เป็น ตอนนี้ไฟล์อ็อบเจ็กต์จะต้องถูกแปลงเป็นไฟล์ที่ปฏิบัติการได้ หากต้องการใช้เรามีการใช้ห้องสมุดcurses.h-lcurses

g++ -o main main.o -lcurses

3. ตอนนี้เรียกใช้ปฏิบัติการ

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