Dalam lingkungan Linux, banyak alat-alat GNU yang diinstal secara default ketika Anda memilih kategori pengembangan C/c ++ selama instalasi, atau menggunakan Manajer paket, instalasi posting. Sebagian besar alat-alat ini didukung oleh paket seperti gcc, glibc, binutils, dll. Anda dapat menggunakan Pengelola paket distribusi khusus untuk menginstal paket-paket hilang atau Anda dapat membangun dari kode sumber.
Untuk Windows, alat-alat serupa yang disediakan oleh MingW suite, awalnya tersedia dari mingw.org; Tapi ini terbatas untuk versi 32-bit dan ada tidak ada update terbaru. Anda mungkin perlu untuk men-download beberapa paket dan menggabungkan mereka untuk versi terbaru. Sebuah utilitas installer pilihan untuk men-download semua paket yang diperlukan dalam modus online. MingW menghasilkan kode untuk Windows runtime dalam PE format, sehingga panggilan sistem UNIX/Linux-specific tidak dapat digunakan dengan ini.
Anda bisa mendapatkan varian gcc, yang datang dengan Code::Blocks IDE TDM. Saat ini gcc v4.9.2 dibundel dengan Code::Blocks v16.01. Dengan ini Anda juga dapat memanfaatkan IDE elegan dengan gcc backend. Download codeblocks-16.01mingw-nosetup.zip dari codeblocks.org/downloads, ekstrak dan kemudian update jalan ke codeblocks-16.01mingw-nosetup\MingW\bin di tingkat pengguna atau tingkat sistem. Sekarang arahkan ke direktori memegang kode di command prompt, dan menjalankan perintah seperti gcc.
Atau sebagai alternatif, Anda dapat menggunakan MingW-w64, yang juga mendukung sistem 64-bit dan menyediakan arsip offline. Anda dapat download arsip dari sourceforge.net/projects/mingw-w64/files/, kemudian arahkan ke penargetan Toolchains Win64/Personal membangun/dongsheng-harian dan memilih versi yang diinginkan seperti 4.8, 4,9 atau 5.x. Extract arsip dan memperbarui path ke direktori bin diekstrak.
Opsional, proyek Cygwin juga menyediakan lingkungan berbasis Unix yang lengkap di Windows dengan perangkat GNU dan lapisan abstraksi untuk api POSIX. Aplikasi UNIX/Linux dapat dipindahkan pada Cygwin.
Program sederhana beserta analisis
Untuk melihat berbagai tahapan menengah sambil membangun, mari kita lihat contoh sederhana berikut:
#simple.c
#include
#define PI 22.0/7.0
int main()
{
double area,r; #a comment
area=PI*r*r;
printf(“area of circle=%lf\n”,area);
return 0;
}
Untuk membangun program di atas, kita menggunakan perintah berikut:
gcc simple.c -o simple
Ketika Anda menjalankan perintah di atas, Apakah Anda pernah berpikir dari berbagai tahapan mendasari pengembangan? GCC dan g ++ (tanpa opsi) mengalami berbagai tahapan seperti preprocessing, perakitan, menghubungkan, dll, dengan bantuan alat seperti cpp, sebagai, ld, dll. Jadi gcc dan g ++ bertindak seperti pembungkus untuk alat-alat ini.
Untuk melihat masing-masing jenis fasa ini, mari kita coba beberapa perintah.
Untuk melihat preprocessed output, Anda dapat menggunakan opsi -E gcc yang memanggil perintah cpp internal. Di sini, Anda dapat melihat konstan simbolis seperti PI digantikan oleh nilai-nilai mereka; Komentar akan dihapus, Macro diperluas dan isi file header disertakan.
gcc -E simple.c #output comes on stdout by default
cpp simple.c -o simple.i
#you can use -o option to store output in a file, .i
extension is a convention to store outcome of preprocessor.
Opsional, kami dapat menyediakan PI konstan simbolis eksternal menggunakan opsi -D :
gcc -DPI=22.0/7.0 simple.c
Untuk menghentikan dengan generasi kode assembly menjadi kode setara dengan kode sumber pilihan -S digunakan, secara internal yang menggunakan cc1, cc1plus perintah:
gcc -S simple.c #generates simple.s
Untuk menemukan perintah cc1, gunakan perintah berikut:
gcc –print-prog-name=cc1 #path could be libexec/gcc/mingw32/4.9.2/ in MingW
Untuk menghasilkan perakitan menggunakan cc1, gunakan perintah yang diberikan di bawah ini:
/cc1 simple.c
#cc1 is not located in bin dir of toolchain
$( gcc –print-prog-name) simple.c #Linux specific
Opsional, Anda dapat menghasilkan file objek dari kode dihasilkan perakitan, sebagai berikut:
as simple.s -o simple.o
Untuk menghentikan kompilasi dari kode sumber, gunakan kode yang diberikan di bawah ini:
gcc -c simple.c #generates object file simple.o
Untuk menggabungkan satu atau lebih file objek dengan perpustakaan diperlukan file, dukungan runtime, dan menghasilkan executable menggunakan collect2, ld internal (misalnya, printf diambil dari standar C library)
gcc simple.o -o simple #generates executable/binary, a.out in absence of -o option
Untuk mempertahankan semua file menengah sambil membangun GCC, ketik:
gcc –save-temps simple.c #keeps simple.i,simple.s,simple.o
GCC mendukung berbagai tingkat pengoptimalan dengan menggunakan pilihan seperti – O1, – O2, – O3 dan – O0 untuk mematikan pengoptimalan, dan -OS untuk mengoptimalkan ruang. Jika Anda berencana untuk kode debug yang dihasilkan menggunakan gdb, -g (-g1, – g2 – g3) pilihan dapat digunakan.
-g2 dianggap jika -g ditentukan dan – g0 mematikan debug dukungan. Anda dapat menggunakan-saya pilihan untuk menentukan jalan kustom file header tambahan. Kompilasi khusus pilihan seperti-saya dan -D bisa pergi di ke variabel CFLAGS, dan pilihan di linker khusus seperti -L -l dan – statis dapat pergi ke variabel LDFLAGS.
Contoh Dalam Multi File
Sekarang mari kita coba contoh lain yang mana aplikasi dibangun dari beberapaberkas sumber; setiap berkas sumber dengan file header termasuk mendapatkandisusun secara individual dikenal sebagai unit penerjemahan. Dalam contoh ini, jumlah dan alun-alun dijalankan dari fungsi utama di test.c, dan didefinisikan dalamsum.c, sqr.c masing-masing. Menganggap Deklarasi fungsi cocok dan file header yang diperlukan.
#test.c:-
int main()
{
int a,b,c,d;
a=10,b=20;
c=sum(a,b);
d=square(a);
printf(“c=%d,d=%d\n”,c,d);
return 0;
}
#sum.c:-
int sum(int x,int y)
{
int z;
z=x+y;
return z;
}
#sqr.c:-
int square(int x)
{
return x*x;
}
Untuk membangun kode di atas, yaitu, mengkompilasi individu terjemahan unit dan link yang dihasilkan objek berkas, Anda dapat menggunakan berikut urutan perintah:
gcc test.c -c #-o test.o
gcc sum.c -c #-o sum.o
gcc sqr.c -c #-o sqr.o
gcc test.o sum.o sqr.o -o all.out
#all.exe in case of windows
Statis vs dinamis
Aplikasi dapat dihubungkan secara statis atau dinamis. Dalam menghubungkan statis, semua kode yang perlu disimpan bagian dari dieksekusi oleh linker, yang memungkinkan kinerja yang lebih baik, menghilangkan runtime overhead. Tapi ini menimbulkan masalah tapak lebih besar executable. Dalam menghubungkan dinamis, fungsi perpustakaan dikecualikan dalam executable dan dimuat pada permintaan yang memungkinkan jejak optimal, tetapi menimbulkan masalah runtime overhead. Pustaka dinamis dilengkapi dengan keuntungan tambahan berbagi antara aplikasi dan dukungan versi. Perpustakaan adalah koleksi file objek. Mari kita membuat perpustakaan untuk fungsi-fungsi yang sering digunakan seperti jumlah dan square dalam kode di atas.
ar rc libsample.a sum.o sqr.o
#static libraries come with extension .a, lib prefix is a convention
gcc -L. -lsample -o p.out
#libsample.a is linked statically and other std libraries like libc.so, libm.so are linked dynamically
gcc -L. -lsample -o s.out -static
# all libraries are linked statically, glibc-devel-static package is required in Linux for static linking of std libs like libc.a, libm.a
# Assume .exe extension instead of .out in windows,
# MingW suite doesn’t have much dynamic libs, most of the linking happens statically here.
gcc -shared sum.o sqr.o -o libsample.so
#On Linux shared object(.so) files support dynamic linking
gcc -shared sum.o sqr.o -o libsample.dll
#On Windows dynamic link libraries(dll) format is used
gcc -L. test.o -lsample -o d.out
#Link with libsample.* dynamically
Sementara itu, opsi -L digunakan oleh gcc untuk menentukan path kustom Perpustakaan kita sendiri, dan -l digunakan untuk menentukan Perpustakaan kustom, dengan asumsi lib awalan dan ekstensi .a atau .so. Dalam perintah di atas, titik (.) ditentukan-l, seperti Perpustakaan diperlukan dalam direktori saat ini; Jadi mengganti titik (.) dengan path yang bersangkutan, sebagaimana berlaku. Sebagai contoh, -lc singkatan dari libc.a atau libc.so, – lpthread singkatan libpthread.*. Kami menggunakan – lsample untuk menentukan libsample.a atau libsample.so.
Ketika .a dan .so tersedia di direktori tertentu, gcc memilih untuk .so file secara default. Di Linux, statis-opsi digunakan untuk menegakkan menghubungkan statis.
Bandingkan s.out, p.out dan d.out menggunakan ukuran perintah atau OS-spesifik perintah seperti ls, du atau dir. Anda akan melihat bahwa s.out berat dengan semua kode Perpustakaan dan d.out sangat ringan dengan minimal kode, sementara p.out datang peralihan seperti hanya perpustakaan kami statis terkait. Utilitas strip dapat diterapkan pada executable untuk mengurangi jejak, yang menghilangkan simbol dari file objek yang mendasari. Harap dicatat bahwa strip tidak dapat diterapkan pada obyek individual file atau Perpustakaan sebelum menghubungkan. Hal ini bermakna untuk executable hanya, terutama statis terkait kode untuk dibatasi lingkungan.
strip s.out #compare the size of s.out before and after strip
Catatan: Bagian berikut adalah Linux tertentu.
Pertama, ketik:
gcc -shared -Wl,-soname,libsample.so -o ~/dlibs/libsample.so.1.0.1 sum.o sqr.o
ldconfig -n ~/dlibs
Untuk menjalankan dieksekusi terkait secara dinamis, kita perlu menentukan path kustom Perpustakaan:
LD_LIBRARY_PATH=~/dlibs ./d.out
Selain itu, kita perlu memperbarui variabel lingkungan LD_LIBRARY_PATH ditambahkan dengan ~ / dlibs. Akan lebih baik jika Anda bisa menambahkan entri direktori kustom dalam /etc/ld.so.conf dan menjalankan ldconfig sekali, untuk memperbarui cache.
Untuk memeriksa dependensi perpustakaan bersama dieksekusi apapun, kita dapat menggunakan ldd, sebagai berikut:
ldd p.out d.out
#our library is listed in d.out but not in p.out
ldd s.out
#says no dependencies
Silakan baca disini untuk rincian lebih lanjut tentang objek yang dibagi file.
File utilitas Linux sederhana menyebutkan jenis setiap file, terutama untuk binari, memberikan detail yang berguna seperti target arsitektur, baik secara statis atau dinamis yang terhubung dan jika itu adalah dilucuti atau tidak.
file d.out p.out s.out
Catatan Tools
Perangkat GNU menargetkan berbagai platform. Ulrich Drepper menulis elfutils semata-mata untuk Linux dan ELF format. Anda dapat men-download dari manajer paket atau membangun mereka dari sumber tersedia di fedorahost. Alat-alat serupa juga tersedia untuk berbagai target platform denganawalan cocok, misalnya, keluarga Linaro toolchains untuk membangun komponenLinux, dan telanjang logam toolchains dari launchpad untuk lengan target menyediakan alat-alat serupa dengan awalan mereka sendiri. Pilihan dan penggunaan alat-alat ini akan mirip dengan langkah-langkah yang disebutkan di sini.
Dalam artikel ini, hanya sedikit petunjuk pada alat telah disediakan. Silakan merujuk ke halaman manual perintah masing-masing dan sumber-sumber lain untuk masukan tambahan.