Menu

Compile C++: Dari Source Code Menjadi Executable dengan g++

Cara C++ mengubah source .cpp menjadi executable native: compile dengan g++ (atau clang++/MSVC), jalankan binary-nya, dan baca error compiler saat terjadi masalah.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Compile, Lalu Jalankan

Setelah compiler terpasang, menjalankan program C++ adalah siklus dua langkah. Berbeda dengan bahasa scripting yang interpreter-nya membaca file baris demi baris, C++ terlebih dulu meng-compile source code-mu menjadi executable native, yaitu binary mandiri berisi kode mesin, lalu kamu menjalankan binary itu secara langsung. Saat program berjalan, tidak ada interpreter di antara programmu dan CPU.

Pemisahan itulah yang membuat C++ cepat, dan juga yang membuat kesalahan sintaks menghentikanmu saat kompilasi, bukan di tengah program berjalan. Compiler memeriksa seluruh file sebelum menghasilkan apa pun.

Kamu bisa menjalankan contoh mandiri apa pun langsung di halaman ini; editor di bawah meng-compile dan menjalankannya untukmu. Namun ada baiknya kamu tahu apa yang terjadi di komputermu sendiri, karena di sanalah proyek sungguhan berada.

Siklus Compile dan Jalankan di Komputermu

Misalnya kamu sudah menyimpan ini sebagai main.cpp:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello from the terminal" << endl;
    return 0;
}

Buka terminal di folder tempat file itu berada, lalu panggil compiler-nya. Compiler yang paling umum adalah g++ (bagian dari GCC); clang++ bekerja persis sama untuk semua hal di sini:

g++ main.cpp -o main

Kalau kodenya berhasil dikompilasi tanpa masalah, g++ tidak mencetak apa pun dan membuat file baru di samping source code-mu: sebuah executable bernama main (atau main.exe di Windows). Binary itu berisi kode mesin: bukan teks yang bisa dibaca, dan terikat pada sistem operasi serta CPU-mu. Sekarang jalankan:

./main
Hello from the terminal

Di Windows kamu menjalankannya sebagai main.exe (atau cukup main) dari terminal yang sama. ./ di macOS dan Linux memberi tahu shell bahwa "programnya ada di folder ini, bukan di suatu tempat di PATH". Pemula sering melupakan langkah ini, lalu bingung kenapa main menampilkan command not found.

Fungsi -o (dan a.out)

Flag -o memberi nama output. Kalau dihilangkan, g++ tetap meng-compile, tetapi menulis executable ke nama default: a.out di macOS/Linux, a.exe di Windows.

g++ main.cpp        # produces a.out, not main
./a.out

Hal ini terus-menerus menjebak orang: mereka meng-compile, tidak melihat error, menjalankan ./main, lalu mendapat No such file or directory, karena binary-nya ternyata bernama a.out. Selalu berikan -o supaya kamu tahu persis apa yang kamu jalankan.

Kamu meng-compile sekali untuk setiap perubahan source code. Setelah itu executable-nya berdiri sendiri; kamu bisa menjalankan ./main seratus kali tanpa compile ulang. Kamu hanya perlu menjalankan g++ lagi setelah mengedit file .cpp.

Memilih Standar C++

C++ punya beberapa versi, yaitu C++11, C++14, C++17, C++20, dan C++23, yang masing-masing menambahkan fitur bahasa. Masalahnya: compiler-mu memilih standar default yang mungkin lebih lama dari dugaanmu, sehingga kode modern bisa gagal dikompilasi tanpa alasan yang jelas. Tetapkan standarnya secara eksplisit dengan -std:

g++ -std=c++17 main.cpp -o main
g++ -std=c++20 main.cpp -o main

Berikut kode yang memakai fitur C++17 (structured bindings). Kode ini berhasil dikompilasi di editor, tetapi di komputermu ia butuh -std=c++17 atau yang lebih baru:

Kalau kamu melihat error seperti 'structured bindings' only available with '-std=c++17', perbaikannya bukan di kodemu, melainkan dengan menambahkan flag -std yang tepat. Di sepanjang kursus ini, anggap kamu memakai C++17 atau yang lebih baru.

Nyalakan Warning

Program C++ bisa berhasil dikompilasi tetapi tetap salah. Kalau kamu meminta, compiler akan menunjukkan kode yang mencurigakan sebelum masalahnya muncul saat program berjalan. Tambahkan -Wall -Wextra:

g++ -std=c++17 -Wall -Wextra main.cpp -o main

Perhatikan program ini. Program ini berhasil dikompilasi tanpa -Wall, tetapi punya bug sungguhan: membaca variabel yang tidak pernah diberi nilai, yang merupakan undefined behavior:

#include <iostream>
using namespace std;

int main() {
    int count;                 // never initialized
    cout << count << endl;     // reads garbage - undefined behavior
    return 0;
}

Dengan warning menyala, compiler menandainya:

warning: 'count' is used uninitialized [-Wuninitialized]

Biasakan compile dengan -Wall -Wextra sejak hari pertama. Warning adalah compiler yang memberimu review kode gratis; mengabaikannya adalah cara bug halus bertahan hidup. Perbaikannya di sini cukup int count = 0;.

Membaca Error Compiler

Saat g++ menolak kodemu, ia menyebutkan file, baris, dan apa yang salah. Belajar membaca pesan-pesan itu adalah separuh dari cara keluar dari kebuntuan. Berikut contoh klasiknya, titik koma yang hilang:

#include <iostream>
using namespace std;

int main() {
    cout << "Oops"      // no semicolon
    return 0;
}
main.cpp:5:5: error: expected ';' before 'return'
    5 |     return 0;
      |     ^~~~~~

Ada beberapa hal yang perlu diperhatikan. Error-nya melaporkan baris 5, tetapi kesalahannya ada di baris 4: compiler baru menyadari ada titik koma yang hilang setelah sampai di token berikutnya. Jadi kalau error menunjuk ke baris yang terlihat benar, periksa baris sebelumnya. main.cpp:5:5 berarti file, baris, lalu kolom. Perbaiki satu hal yang disebutkan, lalu compile ulang. Jangan menebak-nebak.

Error compiler berarti belum ada yang dijalankan. Error ini berbeda dari runtime error, ketika programmu sudah mulai lalu crash. Menangkap kesalahan saat kompilasi, sebelum program sempat berjalan, adalah salah satu kekuatan terbesar C++.

Program untuk Mengecek

Jalankan ini di editor, atau simpan sebagai main.cpp lalu jalankan g++ -std=c++17 -Wall main.cpp -o main kemudian ./main di komputermu sendiri. Kalau ketiga baris muncul, toolchain-mu bekerja dari awal sampai akhir:

Ada tiga hal di sini yang akan segera kamu pelajari dengan benar: variabel int, vector (array C++ yang bisa berubah ukuran), dan cout untuk output. Untuk sekarang, cukup programnya berhasil dikompilasi dan mencetak ketiga baris secara berurutan.

Berikutnya: Sintaks C++

Kamu sudah meng-compile dan menjalankan beberapa program, tetapi kita melewatkan tanda bacanya: baris #include, kurung kurawal, titik koma, int main(), dan alasan setiap baris terlihat seperti itu. Halaman berikutnya mengupas sintaks C++ bagian demi bagian, sehingga strukturnya tidak lagi terasa seperti template yang dihafal dan mulai masuk akal.

Pertanyaan yang sering diajukan

Bagaimana cara compile dan menjalankan program C++?

Simpan kodemu sebagai main.cpp, buka terminal di folder itu, lalu jalankan g++ main.cpp -o main untuk menghasilkan executable. Setelah itu jalankan dengan ./main di macOS/Linux atau main.exe di Windows. Kamu cukup compile sekali; binary hasilnya bisa kamu jalankan sesering yang kamu mau.

Apa fungsi flag -o di g++?

-o memberi nama file output. g++ main.cpp -o hello membuat executable bernama hello. Kalau -o tidak ditulis, g++ memakai nama default a.out (atau a.exe di Windows). Karena itulah pemula sering menjalankan file yang tidak mereka sadari telah mereka buat.

Bagaimana cara compile C++ dengan standar tertentu seperti C++17 atau C++20?

Berikan flag -std: g++ -std=c++17 main.cpp -o main atau -std=c++20. Tanpa flag ini, compiler memakai default-nya sendiri, yang mungkin lebih lama dari dugaanmu, sehingga fitur baru seperti structured bindings atau <ranges> bisa gagal dikompilasi sampai kamu menetapkan standarnya secara eksplisit.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai