Câu trả lời:
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/nullkhô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ì.
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. )
cplandrun xxx.cpp..
crun () { g++ -o $1 $1.cpp && ./$1; }. Để dùng nó: crun xxx.
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".
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