Làm thế nào để biên dịch và chạy tệp cpp chỉ bằng một lệnh trong linux?


5

Gần đây tôi đã bắt đầu học ngôn ngữ c ++ trên linux và bây giờ tôi chạy tệp cpp bằng các lệnh sau.

g++ -o xxx xxx.cpp
./xxx

Có cách nào để làm cho nó một dòng lệnh như compile-and-run xxx.cpp?Cảm ơn.

Câu trả lời:


6

Jeremy Banks đã đăng một trong những thủ thuật tuyệt vời nhất Tôi đã thấy khá lâu ở SO. Về cơ bản, anh ấy thêm một Dòng Bash-Script ở đầu tệp cpp , cho phép anh ta trực tiếp biên dịch và thực hiện tệp đó.

//&>/dev/null;x="${0%.*}";[ ! "$x" -ot "$0" ]||(rm -f "$x";cc -o "$x" "$0")&&exec "$x" "$@"

Giải thích này được sao chép từ ý chính:

//

Vì chúng tôi không muốn điều này hiển thị trong C, chúng tôi đưa nó vào một bình luận.

&>/dev/null

không may // được hiểu là một lệnh shell không hợp lệ và   tạo ra một thông báo lỗi, vì vậy chúng ta cần chuyển hướng nó đến /dev/null để thoát khỏi nó.

;x="${0%.*}"

Điều này xác định tên tệp được biên dịch của chúng tôi sẽ bằng cách sử dụng chuỗi   thay thế để loại bỏ bất kỳ phần mở rộng trên tên tệp hiện tại.

;[ ! "$x" -ot "$0" ]||

Kiểm tra này nếu đã có phiên bản được biên dịch mới hơn   tập tin nguồn. Nếu không...

(rm -f "$x";cc -o "$x" "$0")

... Chúng tôi xóa mọi phiên bản hiện có và sau đó biên dịch mã của bạn, sử dụng tên tệp biên dịch đã chọn của bạn.

&&exec "$x" "$@"

Nếu quá trình biên dịch thành công hoặc không cần thiết, hãy chuyển thực thi cho   mã được biên dịch, chuyển qua các đối số được đưa ra cho kịch bản này.

Kỹ thuật này được gọi là một khối , có nghĩa là nó được viết bằng nhiều ngôn ngữ và cũng có thể được những người phiên dịch ngôn ngữ đó giải thích mà không gặp vấn đề gì.


Đó thực sự là một mẹo hay :)
SpawnST

vấn đề duy nhất là, làm thế nào để tự động thêm dòng này vào đầu mỗi khi tôi tạo tệp cpp ~ mặc dù đây là một chủ đề khác.
SpawnST

@SpawnST: Làm thế nào để bạn tạo tập tin này? Hầu hết các IDE đều hỗ trợ thêm các tiêu đề tự động.
Bobby

Tôi thích điều này. Nó là rất khó khăn.
petersohn

@ Bodbby, tôi sử dụng vim. Tôi sẽ tạo một số phím nóng cho mã.
SpawnST

6

Cái này thì sao?
g++ -o xxx xxx.cpp && ./xxx ?
( && có nghĩa là nó sẽ đợi cho đến khi nhiệm vụ đầu tiên được thực hiện, & có nghĩa là nó sẽ bắt đầu nó ngay sau khi nó bắt đầu, bạn KHÔNG muốn cái này. )


Tôi nghĩ Shiki hiểu rõ những gì '& amp;' có nghĩa là trong một vỏ unix, nhưng chỉ dành cho những người ít hiểu biết, & amp; có nghĩa là lệnh đầu tiên được chạy trong nền (nhưng đầu ra vẫn được điều hướng, tới bàn điều khiển trừ khi sử dụng chuyển hướng.)
bubu

Cảm ơn giải pháp. Nó hoạt động tốt. Tôi có thể làm đẹp hơn bằng cách làm một số công cụ bí danh? Tôi thích phong cách cplandrun xxx.cpp..
SpawnST

@bubu vâng đúng vậy, tôi hiểu rồi :)
SpawnST

và đối với vấn đề này, & amp; & amp; có nghĩa là lệnh thứ hai chỉ được chạy sau khi lệnh đầu tiên được chạy chính xác (nghĩa là trả lại 'ok' cho lệnh) - nếu lệnh được chạy không chính xác, ví dụ: lỗi cú pháp trong quá trình biên dịch, '& amp; & amp; ./xxx 'sẽ không được chạy. ví dụ: ping -c 1 xxx.com & gt; / dev / null & amp; & amp; tiếng vang 'xxx.com lên' || echo 'xxx.com down' sẽ ping xxx.com và hiển thị xxx.com nếu ping thành công và hiển thị xxx.com xuống nếu nó không thành công.
bubu

@SpawnST: Một bí danh sẽ không làm điều đó, nhưng như kim cương cho thấy, một kịch bản sẽ làm điều đó. Hoặc nó có thể được thực hiện trong một chức năng. Sử dụng Của Shiki chỉ huy: crun () { g++ -o $1 $1.cpp && ./$1; }. Để dùng nó: crun xxx.
Dennis Williamson

3

Tạo một Makefile như thế này:

xxx: xxx.cpp
    g++ -o xxx xxx.cpp

run: xxx
   ./xxx

Sau đó chỉ cần gõ make run. Tất nhiên Makefile của bạn có thể phức tạp hơn thế nhiều, đó chỉ là một ví dụ đơn giản. Điều quan trọng là mệnh đề "chạy".


Điều đó thậm chí còn tốt hơn ý tưởng của tôi để làm cho một kịch bản.
lajuette

Có, giải pháp tốt và sạch sẽ hơn viết & amp; & amp; luôn luôn. :)
Shiki

3

một makefile đơn giản, chung chung có thể làm điều đó:

$ cat Makefile  
.SUFFIXES: .o .c  

.c:   
        cc -o $@ $<  
        ./$@  
$ make myprogram  

sẽ biên dịch myprogram.c và sẽ chạy myprogram. Vì nó được định nghĩa với các quy tắc mặc định, điều này hoạt động cho mọi tệp .c trong thư mục này.

Đương nhiên, bạn phải quan tâm đến các thư viện, bao gồm các thư mục và các phụ thuộc khác ...

Tôi hy vọng điều này sẽ giúp, tuy nhiên


1

bạn có thể viết một kịch bản. như:

#!/bin/bash

g++ -o $1 $1.cpp
./$1

sau đó làm cho nó thực thi được chmod u+x script.sh và gọi nó như script.sh yourcode (bỏ qua cpp hoặc thay đổi tập lệnh).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.