Perkenalan

Perkenalan

Setelah semua teori itu dan berbicara, mari kita mulai dengan membangun kode yang ditulis melalui sembilan bagian terakhir dari seri ini. Bagian dari seri kami ini mungkin benar -benar melayani Anda bahkan jika Anda belajar C di tempat lain, atau jika Anda berpikir sisi praktis Anda dari pengembangan C membutuhkan sedikit kekuatan. Kami akan melihat cara menginstal perangkat lunak yang diperlukan, apa yang dilakukan perangkat lunak tersebut dan, yang paling penting, cara mengubah kode Anda menjadi nol dan satu. Sebelum kita mulai, Anda mungkin ingin melihat artikel terbaru kami tentang cara menyesuaikan lingkungan pengembangan Anda:

  • Pengantar editor VIM
  • Pengantar Emacs
  • Menyesuaikan vim untuk pengembangan
  • Menyesuaikan Emacs untuk Pengembangan

Membangun program Anda

Ingat bagian pertama dari seri pengembangan C kami? Di sana kami menguraikan proses dasar yang terjadi saat Anda menyusun program Anda. Tetapi kecuali jika Anda bekerja dalam pengembangan kompiler atau hal -hal lain yang sangat rendah, Anda tidak akan tertarik berapa banyak instruksi JMP yang dimiliki file assembler yang dihasilkan, jika ada. Anda hanya ingin tahu bagaimana menjadi seefisien mungkin. Inilah bagian dari artikel ini, tetapi kami hanya menggaruk permukaan, karena ekstensif subjek. Tetapi seorang programmer C entry-level akan tahu setelah membaca ini semua yang dibutuhkan untuk bekerja secara efisien.

Alat

Selain tahu persis apa yang ingin Anda capai, Anda harus terbiasa dengan alat untuk mencapai apa yang Anda inginkan. Dan ada lebih banyak alat pengembangan linux daripada GCC, meskipun itu saja akan cukup untuk menyusun program, tetapi itu akan menjadi tugas yang membosankan karena ukuran proyek Anda meningkat. Inilah sebabnya mengapa instrumen lain telah dibuat, dan kita akan melihat di sini apa itu dan bagaimana mendapatkannya. Saya sudah lebih dari menyarankan Anda membaca manual GCC, jadi saya hanya akan menganggap Anda melakukannya.

membuat

Bayangkan Anda memiliki proyek multi-file, dengan banyak file sumber, karya-karya. Sekarang bayangkan Anda harus memodifikasi satu file (sesuatu yang kecil) dan menambahkan beberapa kode ke file sumber lain. Akan sangat menyakitkan untuk membangun kembali semua proyek karena itu. Inilah mengapa Make dibuat: Berdasarkan cap waktu file, ia mendeteksi file mana yang perlu dibangun kembali untuk mencapai hasil yang diinginkan (executable, file objek ...), bernama target. Jika konsepnya masih terlihat keruh, jangan khawatir: Setelah menjelaskan makefile dan konsep umum, semuanya akan tampak lebih mudah, meskipun konsep membuat canggih dapat memicu sakit kepala.

Make memiliki nama yang tepat ini di semua platform yang saya kerjakan, yang cukup banyak distro Linux, *BSD dan Solaris. Jadi terlepas dari paket manajer apa yang Anda gunakan (jika ada), baik itu tepat*, yum, zypper, pacman atau muncul, cukup gunakan perintah instalasi masing -masing dan buat sebagai argumen dan hanya itu. Pendekatan lain adalah, pada distro dengan manajer paket yang memiliki dukungan kelompok, untuk menginstal seluruh grup/pola pengembangan C/C ++. Berbicara tentang bahasa, saya ingin menyanggah mitos di sini, yang mengatakan makefiles (serangkaian aturan yang membuat harus diikuti untuk mencapai target) hanya digunakan oleh pengembang C/C ++. Salah. Bahasa apa pun dengan kompiler/penerjemah yang dapat dipanggil dari shell dapat menggunakan fasilitas Make's. Faktanya, proyek apa pun yang membutuhkan pembaruan berbasis ketergantungan dapat menggunakan Make. Jadi definisi yang diperbarui dari makefile File yang menggambarkan hubungan dan ketergantungan antara file proyek, dengan tujuan mendefinisikan apa yang harus diperbarui/dikompilasi kembali dalam hal satu atau lebih file dalam perubahan rantai ketergantungan. Memahami bagaimana membuat pekerjaan sangat penting untuk setiap pengembang C yang bekerja di bawah Linux atau UNIX - ya, komersial Unix menawarkan juga, meskipun mungkin beberapa versi yang berbeda dari GNU Make, yang merupakan subjek kami. "Versi yang berbeda" berarti lebih dari angka, itu berarti BSD Makefile tidak kompatibel dengan GNU Makefile. Jadi pastikan Anda memiliki GNU yang diinstal jika Anda tidak berada di kotak Linux.

Di bagian pertama artikel ini, dan beberapa yang berikutnya, kami menggunakan dan berbicara tentang bagian-bagian dari Yest, sebuah program kecil yang menampilkan tanggal kemarin secara default, tetapi melakukan banyak tanggal yang bagus/berkaitan dengan waktu. Setelah bekerja dengan penulis, Kimball Hawkins, sebuah makefile kecil lahir, itulah yang akan kami kerjakan.

Pertama, mari kita lihat beberapa dasar tentang Makefile. Nama kanonik harus gnumakefile, tetapi jika tidak ada file seperti itu, ia mencari nama seperti Makefile dan Makefile, dalam urutan itu, atau begitulah kata halaman manual. Ngomong -ngomong, tentu saja Anda harus membacanya, dan membacanya lagi, lalu membacanya lagi. Ini tidak sebesar GCC dan Anda dapat mempelajari banyak trik berguna yang akan berguna nanti. Namun, nama yang paling banyak digunakan adalah Makefile, dan saya belum pernah melihat sumber apa pun dengan file bernama Gnumakefile, sejujurnya diceritakan. Jika, karena berbagai alasan, Anda perlu menentukan nama lain, gunakan make's -f, seperti ini:

 $ make -f mymakefile

Inilah Makefile Yest, yang dapat Anda gunakan untuk mengkompilasi dan menginstal program tersebut, karena belum diunggah SourceForge. Meskipun hanya program dua file - sumber dan keropak.

# Makefile untuk menyusun dan memasang yest Uname: = $ (shell uname -s) cc = gcc cflags = -wall cp = cp rm = rm rmflags = -f gzip = versi gzip = yest -2.7.0.5 Yest: ifeq ($ (Uname), sunos) $ (cc) -dsunos $ (cflags) -o yest $ (versi).C kalau tidak $ (Cc) $ (cflags) -o yest $ (versi).C berakhir jika All: Yest Instal Maninstall Instal: Maninstall $ (CP) Yest/usr/local/bin maninstall: $ (cp) $ (versi).man1 yest.1 $ (gzip) yest.1 $ (cp) yest.1.GZ/usr/saham/man/man1/clean: $ (rm) $ (rmflags) yest yest.1.GZ Deinstall: $ (rm) $ (rmflags)/usr/local/bin/yest/usr/share/man/man1/yest1.GZ 

Jika Anda melihat dengan cermat kode di atas, Anda sudah akan mengamati dan mempelajari sejumlah hal. Komentar dimulai dengan hash, dan karena makefiles bisa menjadi sangat samar, Anda lebih baik berkomentar makefile Anda. Kedua, Anda dapat mendeklarasikan variabel Anda sendiri, dan kemudian Anda dapat memanfaatkannya dengan baik. Berikutnya adalah bagian penting: target. Kata -kata yang diikuti oleh usus besar disebut target, dan satu menggunakannya seperti buat [-f name makefile] target_name. Jika Anda pernah menginstal dari sumber, Anda mungkin mengetik 'buat instal'. Nah, 'instal' adalah salah satu target di Makefile, dan target lainnya yang biasa digunakan termasuk 'bersih', 'deinstall' atau 'semua'. Hal terpenting lainnya adalah bahwa target pertama selalu dieksekusi secara default jika tidak ada target yang ditentukan. Dalam kasus kami, jika saya mengetik 'Make', itu akan menjadi setara dengan 'Make Yest', seperti yang Anda lihat, yang berarti kompilasi bersyarat (jika kita berada di Solaris/Sunos kita membutuhkan bendera GCC tambahan) dan penciptaan seorang yang dapat dieksekusi bernama 'Yest'. Target seperti 'semua' dalam contoh kami tidak melakukan apa -apa sendirian, cukup beri tahu bahwa mereka bergantung pada file/target lain yang diperbarui. Tonton sintaksnya, yaitu hal -hal seperti spasi dan tab, seperti yang dibuat cukup megah tentang hal -hal seperti ini.

Berikut makefile pendek untuk proyek yang memiliki dua file sumber. Nama file adalah SRC1.C dan SRC2.C dan nama yang dapat dieksekusi harus menjadi eksekutif. Sederhana, benar?

EXEC: SRC1.o Src2.o GCC -O EXEC SRC1.o Src2.o Src1.O: SRC1.C GCC -C SRC1.C SRC2.O: SRC2.C GCC -C SRC2.C

Satu -satunya target yang secara praktis digunakan, yang juga merupakan default, adalah 'eksekutif'. Dia bergantung di SRC1.o dan src2.o, yang, pada gilirannya, bergantung pada masing -masing .file c. Jadi jika Anda memodifikasi, katakanlah, SRC2.C, yang harus Anda lakukan adalah menjalankan Make lagi, yang akan melihat bahwa SRC2.C lebih baru dari yang lain dan lanjutkan. Ada banyak lagi yang bisa dibuat daripada tertutup di sini, tetapi tidak ada lagi ruang. Seperti biasa, beberapa belajar mandiri didorong, tetapi jika Anda hanya membutuhkan fungsi dasar, hal di atas akan melayani Anda dengan baik.

Skrip konfigurasi

Biasanya bukan hanya 'Make && Make Install', karena sebelum keduanya ada langkah yang menghasilkan Makefile, terutama berguna saat berhadapan dengan proyek yang lebih besar. Pada dasarnya, skrip tersebut memeriksa bahwa Anda memiliki komponen yang diperlukan untuk kompilasi yang diinstal, tetapi juga mengambil berbagai argumen yang membantu Anda mengubah tujuan file yang diinstal, dan berbagai opsi lainnya (e.G. Dukungan QT4 atau GTK3, Dukungan File PDF atau CBR, dan sebagainya). Mari kita lihat dalam sekejap apa yang mengkonfigurasi skrip itu.

Anda biasanya tidak menulis skrip konfigurasi dengan tangan. Anda menggunakan AutoConf dan Automake untuk ini. Seperti yang disiratkan oleh nama, apa yang mereka lakukan adalah menghasilkan skrip dan makefile mengkonfigurasi masing -masing. Misalnya, dalam contoh kami sebelumnya dengan program Yest, kami sebenarnya dapat menggunakan skrip konfigurasi yang mendeteksi lingkungan OS dan mengubah beberapa variabel membuat, dan setelah semua yang menghasilkan makefile. Kami telah melihat bahwa Makefile Yest memeriksa jika kami menjalankan Sunos, dan jika kami, menambahkan bendera kompiler. Saya akan memperluasnya untuk memeriksa apakah kami sedang mengerjakan sistem BSD dan jika demikian, memohon gmake (GNU Make) alih -alih make asli yang, seperti yang kami katakan, tidak kompatibel dengan GNU Makefiles GNU. Kedua hal ini dilakukan dengan menggunakan autoconf: kami menulis kecil Konfigurasikan.di dalam File di mana kami memberi tahu AutoConf apa yang perlu kami periksa, dan biasanya Anda ingin memeriksa lebih dari platform OS. Mungkin pengguna tidak memiliki kompiler yang diinstal, tidak membuat, tidak ada pustaka pengembangan yang penting waktu kompilasi dan sebagainya. Misalnya, garis yang akan memeriksa keberadaan waktu.H di sistem header standar sistem akan terlihat seperti itu:

 Ac_check_headers (waktu.H)

Kami menyarankan Anda mulai dengan aplikasi yang tidak terlalu besar, periksa konten tarball sumber dan baca konfigurasi.di dan/atau konfigurasikan.file ac. Untuk tarball yang memilikinya, Makefile.AM juga merupakan cara yang baik untuk melihat bagaimana file automake terlihat. Ada beberapa buku bagus tentang masalah ini, dan salah satunya adalah “pengelolaan proyek dengan GNU Make” Robert Mecklenburg.

Tips GCC dan bendera baris perintah biasa

Saya tahu manual GCC itu besar dan saya tahu banyak dari Anda bahkan belum membacanya. Saya bangga membaca semuanya (semua yang berkaitan dengan IA Hardware) dan saya harus mengakui bahwa saya sakit kepala setelah itu. Kemudian lagi, ada beberapa opsi yang harus Anda ketahui, meskipun Anda akan belajar lebih banyak saat Anda pergi.

Anda telah menemukan bendera -o, yang memberi tahu GCC apa yang dihasilkan outfile, dan -c, yang memberitahu GCC untuk tidak menjalankan tautan, sehingga menghasilkan apa yang dimuruskan assembler, yaitu file objek objek. Omong -omong, ada opsi yang mengontrol tahapan di mana GCC harus menghentikan eksekusi. Jadi untuk berhenti sebelum tahap perakitan, setelah kompilasi per se, gunakan -s. Dalam nada yang sama, -e akan digunakan jika Anda ingin menghentikan GCC tepat setelah preprocessing.

Ini adalah praktik yang baik untuk mengikuti standar, jika bukan untuk keseragaman, tetapi untuk kebiasaan pemrograman yang baik. Jika Anda berada di periode formatif sebagai pengembang C, pilih standar (lihat di bawah) dan ikuti. Bahasa C adalah standar pertama setelah Kernighan dan Ritchie (RIP) menerbitkan "Bahasa Pemrograman C" pada tahun 1978. Itu adalah standar non-formal, tetapi di dalam segera dijuluki K&R dan dihormati. Tapi sekarang sudah usang dan tidak direkomendasikan. Kemudian, di tahun 80 -an dan tahun 90 -an, ANSI dan ISO mengembangkan standar resmi, C89, diikuti oleh C99 dan C11. GCC juga mendukung standar lain, seperti GNUxx, di mana xx bisa 89 atau 99, sebagai contoh. Periksa manual untuk detailnya, dan opsinya adalah '-std =', “ditegakkan” oleh '-pedantic'.

Opsi terkait peringatan dimulai dengan "-W", seperti '-wall' (ini memberitahu GCC untuk mengaktifkan semua kesalahan, meskipun mereka tidak cukup diaktifkan) atau '-werror' (perlakukan peringatan sebagai kesalahan, selalu direkomendasikan). Anda dapat memberikan argumen tambahan ke program yang membantu dengan langkah -langkah perantara, seperti preprocessor, assembler atau linker. Misalnya, inilah cara meneruskan opsi ke tautan:

 $ gcc [opsi lain…] -wl,pilihan [satu set opsi lain…]

Demikian pula dan intuitif, Anda dapat menggunakan 'wa,' untuk assembler dan 'wp,' untuk preprocessor. Perhatikan koma dan ruang putih yang memberi tahu kompiler bahwa bagian preprocessor/assembler/linker telah berakhir. Keluarga pilihan yang berguna lainnya termasuk '-g' dan teman untuk debugging, '-o' dan teman untuk optimasi atau '-idirektori' - tidak ada ruang putih - untuk menambahkan lokasi yang mengandung header.

Kesimpulan

Saya sarankan Anda meluangkan waktu untuk membaca artikel ini, bermain dengan contoh, lalu tulis sendiri, meningkatkan kompleksitas saat Anda pergi.

Inilah yang dapat Anda harapkan selanjutnya:

  • SAYA. C Perkembangan di Linux - Pendahuluan
  • Ii. Perbandingan antara C dan bahasa pemrograman lainnya
  • AKU AKU AKU. Jenis, Operator, Variabel
  • Iv. Alur kontrol
  • V. Fungsi
  • Vi. Pointer dan Array
  • Vii. Struktur
  • Viii. I/O Dasar
  • Ix. Gaya pengkodean dan rekomendasi
  • X. Membangun program
  • Xi. Kemasan untuk Debian dan Fedora
  • Xii. Mendapatkan paket di repositori resmi Debian

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Instal Arch Linux di VMware Workstation
  • Tutorial debugging GDB untuk pemula
  • Lanjutan regex bash canggih dengan contoh
  • Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
  • Manipulasi data besar untuk kesenangan dan keuntungan bagian 1
  • Ekspresi reguler Python dengan contoh
  • Loop bash dengan contoh