C öğrenirken en hızlı ilerleme, yazdığınız kodu kendi bilgisayarınızda derleyip çalıştırabildiğiniz ve adım adım izleyebildiğiniz zaman gelir. Tarayıcıda çalışan kod ortamları kısa örnekler için yeterlidir, ancak birden fazla dosyadan oluşan projeler, derleyici uyarılarını okumak ve hata ayıklayıcı (debugger) ile değişkenleri izlemek için gerçek bir ortam gerekir. Bu yazıda Windows, macOS ve Linux üzerinde VS Code ile GCC'yi kuracak, ilk programınızı önce terminalden, sonra VS Code içinden derleyip hata ayıklayıcıyla çalıştıracaksınız. Burada kurduğunuz GCC, gömülü sistemlerde kullanacağınız avr-gcc ve arm-none-eabi-gcc derleyicileriyle aynı ailedendir; komut satırı bayrakları ve hata mesajları da büyük ölçüde aynıdır.
Bu yazının sonunda şunları yapabileceksiniz: VS Code, C/C++ eklentisi, GCC ve hata ayıklayıcıyı kendi işletim sisteminize kurmak; bir C programını terminalden uyarı bayraklarıyla derlemek; VS Code içinde
Ctrl+Shift+Bile derleyipF5ile breakpoint'te durmak ve sık görülen kurulum hatalarını çözmek.
Not: Kurulum adımları VS Code'un resmi C/C++ rehberlerini takip eder. Rehberler C++ (
g++) üzerinden anlatılmıştır; biz aynı adımları C içingccile uyguluyoruz.
VS Code bir kod editörüdür; kendi başına C kodu derleyemez. Bir C programını çalıştırmak için birlikte çalışan üç ayrı araca ihtiyaç vardır:
| Araç | Görevi | Windows | macOS | Linux |
|---|---|---|---|---|
| Editör | Kodu yazmak, aracı çağırmak | VS Code | VS Code | VS Code |
| Derleyici | .c dosyasını çalıştırılabilir dosyaya çevirmek |
GCC (MSYS2) | Clang (gcc adıyla da çağrılır) |
GCC |
| Hata ayıklayıcı | Programı satır satır çalıştırmak, değişkenleri izlemek | GDB | LLDB | GDB |
{
"title": "VS Code ile C Programı Derleme Akışı",
"subtitle": "Editör yalnızca derleyiciyi ve hata ayıklayıcıyı çağırır; asıl işi onlar yapar",
"nodes": [
{ "id": "src", "label": "hello.c", "sub": "VS Code'da yazdığınız kaynak kod", "color": "blue" },
{ "id": "gcc", "label": "gcc", "sub": "Önişlemci + derleyici + bağlayıcı", "color": "slate" },
{ "id": "exe", "label": "hello / hello.exe", "sub": "Çalıştırılabilir dosya (-g ile debug bilgisi)", "color": "amber" },
{ "id": "dbg", "label": "GDB / LLDB", "sub": "Breakpoint, adım adım çalıştırma", "color": "slate" },
{ "id": "out", "label": "Terminal çıktısı", "sub": "printf ile yazılan metin", "color": "green" }
],
"edges": [
{ "from": "src", "to": "gcc", "forwardLabel": "Ctrl+Shift+B" },
{ "from": "gcc", "to": "exe", "forwardLabel": "-o hello" },
{ "from": "exe", "to": "dbg", "forwardLabel": "F5" },
{ "from": "dbg", "to": "out", "forwardLabel": "" }
]
}
VS Code'daki "Build" ve "Debug" düğmeleri arka planda bu araçları komut satırından çağırır. Bu yüzden önce derleyicinin terminalden tek başına çalıştığından emin olacağız; VS Code entegrasyonu en son adımdır.
Kısacası: editör, derleyici ve hata ayıklayıcı ayrı programlardır ve üçünün de kurulu olması gerekir.
Ctrl+Shift+X, macOS'ta Cmd+Shift+X).C/C++ yazın ve yayıncısı Microsoft olan C/C++ eklentisini kurun. Eklenti kimliği ms-vscode.cpptools'tur.Uyarı: Aynı aramada çıkan Code Runner eklentisini kurmanız gerekmez. Code Runner programı salt okunur bir "Output" panelinde çalıştırır;
scanfile klavyeden veri okuyan programlar orada girdi alamaz ve takılıp kalmış gibi görünür.
C/C++ eklentisi bir derleyici içermez; yalnızca kod tamamlama, hata işaretleme ve hata ayıklayıcı entegrasyonu sağlar. Derleyiciyi bir sonraki bölümde ayrıca kuracağız.
Yalnızca kendi işletim sisteminizin alt başlığını uygulayın.
Windows'ta GCC'yi MSYS2 üzerinden kuruyoruz. MSYS2, Windows için hazırlanmış GCC, GDB ve diğer geliştirme araçlarını tek bir paket yöneticisiyle (pacman) kurmanızı sağlar. 64-bit Windows 10 (1809 veya üstü) ya da Windows 11 gerekir.
C:\msys64'tür; değiştirmemenizi öneririz.pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
Enter ile varsayılanı (tümü) kabul edin, kurulum onayı sorulduğunda Y yazın. Bu paket grubu gcc, g++ ve gdb'yi birlikte kurar.Şimdi Windows'un bu araçları her terminalden bulabilmesi için klasörü PATH ortam değişkenine ekleyin:
Path'i seçip Edit'e tıklayın.C:\msys64\ucrt64\bin
Uyarı:
PATHdeğişikliği yalnızca yeni açılan terminallerde geçerli olur. Kurulumdan önce açık olan Komut İstemi, PowerShell ve VS Code pencerelerini kapatıp yeniden açın.
Not: WSL2 kullanıyorsanız bu alt başlığı atlayıp WSL terminalinde Linux adımlarını uygulayabilirsiniz. Bu yazıda anlatılan yöntem ise doğrudan Windows üzerinde çalışan
.exedosyaları üretir.
macOS'ta derleyici Apple'ın Xcode Command Line Tools paketiyle gelir. Terminali açın ve kontrol edin:
clang --version
Komut bulunamazsa paketi kurun:
xcode-select --install
Açılan pencerede Install'a tıklayın. Kurulum birkaç dakika sürer.
Not: macOS'ta
gcckomutu aslında Clang derleyicisini çalıştırır;gcc --versionçıktısında "Apple clang" yazdığını göreceksiniz. C öğrenmek için bu tamamen yeterlidir: Clang aynı C standardını derler ve bu yazıdaki bayrakları (-Wall,-Wextra,-g,-std=c11) aynen kabul eder. Hata ayıklayıcı olarak GDB yerine LLDB kullanılır.
sudo apt-get update
sudo apt-get install build-essential gdb
build-essential paketi gcc, make ve standart C kütüphanesinin başlık dosyalarını birlikte kurar. Fedora'da karşılığı sudo dnf install gcc gdb make, Arch'ta sudo pacman -S base-devel gdb'dir.
Hangi işletim sisteminde olursanız olun, bu adımın sonunda terminalden çağrılabilen bir C derleyiciniz ve bir hata ayıklayıcınız olmalıdır.
Yeni bir terminal açın (Windows'ta Komut İstemi veya PowerShell; MSYS2 terminali değil) ve şu komutları çalıştırın:
gcc --version
gdb --version # Windows ve Linux
lldb --version # macOS
Windows'ta gcc --version çıktısının ilk satırı gcc.exe (... Built by MSYS2 project) ile başlar ve ardından sürüm numarası gelir. Linux'ta gcc (Ubuntu ...), macOS'ta Apple clang version ... görürsünüz.
Her komut bir sürüm satırı yazdırıyorsa kurulum tamamdır. 'gcc' is not recognized veya command not found hatası alırsanız aşağıdaki Sık Karşılaşılan Sorunlar tablosuna bakın.
Derleyicinin terminalden çalıştığını doğrulamadan VS Code ayarlarına geçmeyin; VS Code da aynı komutu çağıracaktır.
Önce VS Code'u hiç kullanmadan derleme zincirini çıplak haliyle görelim. Bir çalışma klasörü oluşturun:
mkdir c-projects
cd c-projects
mkdir hello
cd hello
İpucu: Klasör adlarında boşluk ve Türkçe karakter kullanmayın (
C Projelerimyerinec-projects). Bazı araçlar bu tür yolları yanlış ayrıştırır ve anlaşılması zor hatalar üretir.
Bu klasörde hello.c adında bir dosya oluşturun:
#include <stdio.h>
int main(void)
{
printf("Merhaba, C!\n");
return 0;
}
Derleyip çalıştırın:
gcc -std=c11 -Wall -Wextra -g hello.c -o hello
./hello # macOS, Linux ve Windows PowerShell
hello.exe # Windows Komut İstemi
Ekranda Merhaba, C! yazısını görmelisiniz. Kullandığımız bayrakların her biri bilinçli bir seçimdir:
| Bayrak | Anlamı | Neden kullanıyoruz? |
|---|---|---|
-std=c11 |
C11 standardına göre derle | Derleyiciden derleyiciye değişen varsayılan yerine sabit bir dil sürümü |
-Wall |
Yaygın uyarıları aç | Hatalı ama derlenen kodu (yanlış printf formatı, kullanılmayan değişken) yakalar |
-Wextra |
Ek uyarıları aç | -Wall'un kapsamadığı durumları (kullanılmayan parametre, işaretli/işaretsiz karşılaştırma) yakalar |
-g |
Hata ayıklama bilgisi ekle | GDB/LLDB'nin kaynak satırlarını ve değişken adlarını gösterebilmesi için gerekir |
-o hello |
Çıktı dosyasının adı | Verilmezse çıktı a.out (Windows'ta a.exe) olur |
Gömülü projelerde de aynı bayrakları kullanacaksınız; örneğin avr-gcc -std=c11 -Wall -Wextra -g -mmcu=atmega328p ... komutu buradakinin yalnızca hedef işlemci eklenmiş halidir.
Bu adımda derleyicinin VS Code'dan bağımsız bir program olduğunu ve tek komutla .c dosyasından çalıştırılabilir dosya ürettiğini gördünüz.
VS Code'da File > Open Folder ile hello klasörünü açın. VS Code ayarlarını bu klasörün içindeki .vscode/ alt klasörüne kaydeder; her proje için ayrı bir klasör açmak bu yüzden önemlidir. Windows'ta VS Code'u PATH değişikliğinden sonra başlattığınızdan emin olun.
hello.c dosyasını açın ve printf satırının solundaki boşluğa tıklayarak (veya F9) bir breakpoint koyun. Kırmızı bir nokta belirir.Uyarı: Listede
g++/clang++seçenekleri de görünür; bunlar C++ derleyicileridir. C dosyaları içingcc/clangsatırını seçin.
VS Code programı derler, hata ayıklayıcıyı başlatır ve breakpoint satırında durur. Sol paneldeki Variables bölümünde yerel değişkenleri görebilirsiniz. Üstteki araç çubuğuyla programı ilerletin:
| Tuş | Komut | Etkisi |
|---|---|---|
F5 |
Continue | Bir sonraki breakpoint'e kadar çalıştır |
F10 |
Step Over | Satırı çalıştır, fonksiyonun içine girme |
F11 |
Step Into | Çağrılan fonksiyonun içine gir |
Shift+F5 |
Stop | Hata ayıklamayı bitir |
Bu ilk çalıştırmada VS Code .vscode/ klasörüne iki dosya oluşturur: derleme komutunu tanımlayan tasks.json ve hata ayıklayıcı ayarlarını tutan launch.json.
Otomatik oluşturulan tasks.json yalnızca -g bayrağını kullanır. terminalden derlerken kullandığımız uyarı bayraklarını eklemek için .vscode/tasks.json dosyasını açın ve args listesini aşağıdaki gibi düzenleyin. Windows için tam dosya:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe build active file",
"command": "C:\\msys64\\ucrt64\\bin\\gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-std=c11",
"-Wall",
"-Wextra",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": { "cwd": "${fileDirname}" },
"problemMatcher": ["$gcc"],
"group": { "kind": "build", "isDefault": true },
"detail": "Task generated by Debugger."
}
]
}
macOS ve Linux'ta dosya aynı yapıdadır; yalnızca şu alanlar farklıdır:
| Alan | macOS | Linux |
|---|---|---|
label |
C/C++: clang build active file |
C/C++: gcc build active file |
command |
/usr/bin/clang |
/usr/bin/gcc |
Çıktı yolu (-o sonrası) |
${fileDirname}/${fileBasenameNoExtension} |
${fileDirname}/${fileBasenameNoExtension} |
Not:
labeldeğerini değiştirmeyin.launch.jsoniçindekipreLaunchTaskalanı derleme görevini bu adla bulur; ikisi birebir aynı olmalıdır.
Artık Ctrl+Shift+B (macOS'ta Cmd+Shift+B) yalnızca derler, F5 ise derleyip hata ayıklayıcıyı başlatır. Derleyici uyarıları ve hataları Problems panelinde listelenir; bir satıra tıklamak sizi ilgili kod satırına götürür (problemMatcher: $gcc bunu sağlar).
İpucu: Derleme ve hata ayıklama komutları o an editörde açık olan dosyayı (
${file}) derler.tasks.jsonaçıkkenCtrl+Shift+B'ye basarsanız GCC JSON dosyasını derlemeye çalışır ve anlamsız hatalar verir. Önce.cdosyasının sekmesine tıklayın.
Artık VS Code, terminalde elle yazdığınız GCC komutunun aynısını bir kısayolla çalıştırıyor ve hata ayıklayıcıyı ona bağlıyor.
| Belirti | Olası neden | Çözüm |
|---|---|---|
'gcc' is not recognized as an internal or external command |
C:\msys64\ucrt64\bin PATH'te yok veya terminal eski |
PATH'i kontrol edin, tüm terminalleri ve VS Code'u kapatıp yeniden açın |
MSYS2'de gcc: command not found |
Yanlış MSYS2 kabuğu açık | Başlat menüsünden MSYS2 UCRT64 kabuğunu açın veya normal Komut İstemi kullanın |
gdb --version çalışmıyor ama gcc çalışıyor |
toolchain grubu eksik kurulmuş |
MSYS2'de pacman -S --needed mingw-w64-ucrt-x86_64-gdb |
| VS Code'da "miDebuggerPath is invalid" | GDB kurulu değil veya yol yanlış | Önceki satırdaki gibi GDB'yi kurun, launch.json'daki yolu kontrol edin |
scanf içeren program girdi beklerken takılıyor |
Code Runner'ın "Output" paneli kullanılıyor | Programı F5 ile veya terminalden çalıştırın |
Permission denied / .exe silinemiyor |
Program hâlâ çalışıyor veya antivirüs dosyayı kilitledi | Çalışan programı kapatın; gerekirse proje klasörünü antivirüs taramasından hariç tutun |
#include <stdio.h> altı kırmızı dalgalı |
Eklenti derleyiciyi bulamadı | Ctrl+Shift+P > C/C++: Select IntelliSense Configuration ile gcc / clang'ı seçin |
Sorunların büyük çoğunluğu PATH ve eski terminal penceresinden kaynaklanır; ilk adım her zaman yeni bir terminalde gcc --version denemektir.
Yazıyı, derleyici uyarılarının neden açık tutulduğunu gösteren küçük bir programla bitirelim. hello klasörünün yanında average adında yeni bir klasör açın, içinde average.c oluşturun:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint8_t samples[4] = {12, 15, 11, 14};
uint16_t sum = 0;
int unused;
for (int i = 0; i < 4; i++) {
sum += samples[i];
}
float average = sum / 4.0f;
printf("Toplam: %u\n", sum);
printf("Ortalama: %d\n", average); /* hatalı format: float için %d */
return 0;
}
Ctrl+Shift+B ile derleyin. Program yine de derlenir, ancak Problems panelinde iki uyarı görürsünüz:
warning: unused variable 'unused' [-Wunused-variable]
warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]
macOS'ta Clang aynı iki sorunu biraz farklı cümlelerle bildirir (format specifies type 'int' but the argument has type 'double'); anlamı aynıdır.
İkinci uyarı gerçek bir hatadır: printf float değeri tamsayı gibi okur ve ekrana anlamsız bir sayı yazar. -Wall olmasaydı bu kod sessizce derlenecekti. Şimdi düzeltin:
int unused; satırını silin.printf satırını printf("Ortalama: %.2f\n", average); olarak değiştirin.sum += samples[i]; satırına breakpoint koyun ve F5 ile hata ayıklamayı başlatın.F10 ile her adımda Variables panelinde i ve sum değerlerinin nasıl değiştiğini izleyin: sum sırasıyla 12, 27, 38, 52 olur.F5 ile programı tamamlayın. Terminalde Toplam: 52 ve Ortalama: 13.00 görmelisiniz.Bu küçük döngü, gömülü sistemlerde de her gün yapacağınız işin aynısıdır: derle, uyarıları oku, düzelt, hata ayıklayıcıyla değişkenleri izle.
gcc --version sürüm yazdırıyorgdb --version (macOS'ta lldb --version) sürüm yazdırıyorhello.c terminalden derlenip çalışıyorCtrl+Shift+B uyarı bayraklarıyla derliyor ve uyarılar Problems panelinde görünüyorF5 ile breakpoint'te durup değişkenleri izleyebiliyorsunuzListenin tamamı işaretliyse ortamınız hazır.
VS Code yalnızca bir editördür; C kodunu derleyen GCC (macOS'ta Clang) ve programı adım adım çalıştıran GDB (macOS'ta LLDB) ayrı kurulan araçlardır. Bir sorun çıktığında ilk olarak yeni bir terminalde gcc --version ile derleyicinin PATH üzerinden bulunduğunu kontrol etmek ve uyarı bayraklarını (-Wall -Wextra) hiçbir zaman kapatmamak gerekir.
| Kavram | Açıklama |
|---|---|
| Editör / derleyici / hata ayıklayıcı | VS Code kodu yazar; GCC derler; GDB/LLDB çalışan programı izler |
| MSYS2 UCRT64 | Windows'ta GCC ve GDB'yi pacman ile kurmak için kullanılan ortam |
PATH |
Terminalin gcc komutunu bulduğu klasör listesi; değişiklik yeni terminallerde geçerli olur |
-Wall -Wextra |
Derlenen ama hatalı olan kodu uyarı olarak gösteren bayraklar |
-g |
Hata ayıklayıcının kaynak satırlarını ve değişken adlarını görmesini sağlar |
tasks.json |
VS Code'un Ctrl+Shift+B ile çalıştırdığı derleme komutu |
launch.json |
F5 ile başlatılan hata ayıklama ayarları; preLaunchTask ile derleme görevine bağlanır |
| Breakpoint | Programın durduğu satır; F10/F11 ile adım adım ilerlenir |
Ortamınız hazır olduğuna göre C'nin gömülü sistemlerde neden bu kadar yaygın olduğunu Gömülü Sistemlerde C Programlama Dili yazısında, aynı GCC'nin bir mikrodenetleyici için firmware üretirken arka planda neler yaptığını ise GCC Build Pipeline yazısında okuyabilirsiniz.
Kitap serisini incele →