Bagaimana cara mengatasi proyek Linux / makefile besar secara efektif?

16

Saya telah mengembangkan aplikasi Windows di C ++ selama 10 tahun sekarang. Dan baru-baru ini saya mulai menggali beberapa proyek Linux, dan saya tidak tahan betapa tidak produktifnya saya ...

Saya seorang pembelajar yang cepat, dan saya telah menggunakan Linux sebagai platform utama untuk beberapa waktu sekarang. Dan saya merasa sangat nyaman dengan shell, prinsip-prinsip OS dan GUI. Tapi ketika datang ke pengembangan, rasanya aku kembali ke sekolah.

Begitu saya membuka beberapa proyek yang lebih besar, saya macet. Sebagian besar dari mereka berbasis makefile, jadi pada dasarnya ketika saya mencoba menavigasi mereka dengan QT atau CodeBlocks, paling-paling, saya bisa menggunakan intellisense berdasarkan per-file. Dan sebagian besar variabel waktu bocor dari ruang lingkup.

Lalu ada hal-hal yang masuk ke definisi, yang tampaknya tidak ada, cobalah untuk bergabung dengan beberapa proyek yang lebih besar dari sourceforge, dan Anda terjebak selama berhari-hari, karena menavigasi ke definisi sangat sulit ... grep -r "this_def" . --include "*.cpp" --include "*.h"tampaknya sangat lambat dan canggung.

Dan kemudian, debugging, gdb berhasil, tetapi tidak peduli apa yang saya lakukan, sepertinya itu tahun-tahun cahaya di belakang WinDbg atau VisualStudio debugger.

Dan hal-hal ini membuat saya putus asa, saya ingin menulis kode, tapi itu berjalan sangat lambat ... Saya mulai berpikir bahwa pengembang Linux mempelajari definisi fungsi dengan hati dan menganalisis kode dengan mata, tetapi saya tidak percaya itu begitu.

Adakah yang pernah mengalami ini? Adakah sesuatu yang saya lewatkan yang dapat membuat saya lebih produktif?

Coder
sumber
8
+1, saya telah mencapai kesimpulan yang sama tentang debugger Visual Studio; tidak ada IDE lain pada platform apa pun yang mendekati kemampuan inspeksi.
Aphex

Jawaban:

22

Cukup menarik secara berkala saya memiliki masalah yang sama di arah yang berlawanan. Saya terutama seorang programmer UNIX, tapi saya secara berkala harus porting barang ke Windows. Saya tidak bisa memberi tahu Anda berapa kali saya ingin mencabut rambut saya karena saya tidak dapat menemukan kotak centang yang sesuai untuk opsi kompiler yang terkubur dalam salah satu dari 35 halaman pengaturan preferensi untuk suatu proyek. Saya lebih suka membuka file proj dan menambahkan XML sendiri.

Bergerak ke arah mana pun, rahasianya adalah memiliki kesabaran, dan mempelajari alat yang diatur untuk platform yang Anda coba masuki. Tentu saja Anda akan frustrasi, itu baru, dan itu tidak dikenal, dan Anda akan menjadi status pemula. lagi. Tidak ada cara untuk menghindari ini.

Dalam kasus khusus Anda ada beberapa alat tambahan yang harus Anda ketahui. Yang pertama adalah DDD , front end GUI untuk gdb. Ini tidak selipis Visual Studio, tetapi itu akan memegang tangan Anda. Namun, saya benar-benar merekomendasikan menggigit peluru, dan mulai belajar seluk beluk gdb. Sebenarnya, jika Anda adalah pengguna biasa, tidak ada banyak perbedaan antara menghafal perintah mana yang harus diketik vs menghafal kotak dialog mana yang harus Anda bawa untuk mengubah pengaturan.

Anda juga perlu tahu tentang alat-alat seperti CScope dan CTags . Sebanyak mungkin Anda menolak, saya sarankan belajar VIM atau EMACS . Mereka terintegrasi dengan baik dengan alat tag yang baru saja saya sebutkan. Ketika di Roma, lakukan seperti yang dilakukan orang Romawi. Anda dapat menemukan ekstensi untuk VIM dan EMACS yang akan menyelesaikan kode untuk Anda. Pengalaman saya sendiri dengan alat yang menawarkan penyelesaian kode adalah bahwa ya, memang menghemat beberapa pengetikan, tetapi secara umum pengetikan mudah. Berpikir adalah yang sulit. Pendapat Anda mungkin berbeda, terutama jika Anda memiliki sindrom carpal tunnel.

Adapun make. Make memang diakui mengerikan, tetapi Anda mungkin harus menyedotnya dan mempelajarinya.

Charles E. Grant
sumber
6
+1, menghafal perintah tidak lebih sulit daripada menghafal GUI
Javier
5
Jelas belajar VIM atau EMACS. Alasan linux tidak benar-benar memiliki gui seperti Visual Studio, adalah karena VIM dan EMACS memiliki semua fitur yang sama, dan banyak lagi. Saya punya salinan VIM yang saya atur untuk menggunakan satu set plugin yang memberi saya pelengkapan otomatis dengan tab, snippet, navigasi proyek, built in terminal, tag, navigasi tag, konversi spasi, dan semuanya kembali ke github . Di tempat kerja saya menggunakan windows, jadi itulah yang menggunakan info pathing di file vimrc.
Spencer Rathbun
2
@ Javier Terakhir kali saya memeriksa, GUI menampilkan banyak fungsi di depan mata, tidak perlu dihafal. Layar VIM tidak memiliki petunjuk atau pengingat.
quant_dev
2
@tdammers Saya telah melihat cukup kode Linux di waktu saya untuk memanggil BS tentang itu.
quant_dev
4
@quant_dev, cepat! Di mana Anda mengatur opsi tautan untuk memperlakukan simbol duplikat sebagai kesalahan? Tentu, Anda dapat menemukannya dengan menjelajahi semua item di bagian tautan dari properti C / C ++ proyek, tetapi itu tidak lebih (atau kurang) terlihat jelas daripada mencarinya di halaman manual untuk tautan tersebut.
Charles E. Grant
11

Saya telah mengembangkan aplikasi Windows di C ++ selama 10 tahun sekarang. Dan baru-baru ini saya mulai menggali beberapa proyek Linux, dan saya tidak tahan betapa tidak produktifnya saya ...

Adakah sesuatu yang saya lewatkan yang dapat membuat saya lebih produktif?

Kembangkan di Windows, gunakan di Linux.

Ini termasuk menjalankan unit test baik pada mesin Anda sendiri (Windows), dan pada server build (Linux).

Sebagai efek samping, Anda akan belajar cara menulis kode portabel.

Efek positif lainnya adalah bahwa menggunakan kompiler yang berbeda akan menghasilkan lebih banyak peringatan dan dengan demikian menangkap lebih banyak bug.

UPDATE : Untuk semua fanboys Linux downvoting jawaban ini: Saya tidak mengatakan bahwa semua orang harus mengembangkan pada Windows! Tetapi menggunakan platform yang Anda kenal dengan baik lebih produktif daripada menghabiskan banyak waktu untuk mempelajari platform baru.

Sjoerd
sumber
Bisakah orang yang downvoter menyatakan mengapa dia downvot?
Sjoerd
Dugaan saya adalah karena Anda tidak menjawab pertanyaan. Masalahnya adalah bekerja pada proyek linux yang ada ; porting ke Windows terlebih dahulu dan kemudian kembali bukan solusi yang layak.
tdammers
-1: Jika itu pilihan, OP tidak akan memiliki masalah aslinya. Dan mengembangkan pada Windows memberi Anda semua biaya pengembangan Windows (seperti prosedur instalasi perangkat lunak abad ke-18 yang mengerikan) dan Anda masih harus menulis Makefile dan melakukan cross-debug aplikasi Anda dengan gdb, jika ada sesuatu yang tidak sepenuhnya portabel.
thiton
@tdammers Memeriksa sumber dan membuat proyek dari * .cpp berfungsi dalam banyak kasus. Bahkan jika itu membutuhkan beberapa jam untuk pengaturan, itu jauh lebih sedikit daripada yang diperlukan untuk mempelajari lingkungan pengembangan yang berbeda lengkap.
Sjoerd
1
Di sisi lain, mempelajari lebih lanjut tentang platform yang harus Anda kerjakan tampaknya alami & bermanfaat.
Basile Starynkevitch
4

Masalah Anda telah terpecahkan berkali-kali di dunia Linux, namun, tidak seperti alat Windows / Microsoft, itu tidak akan diserahkan ke piring perak dengan lauk tambahan. Anda mungkin perlu melakukan beberapa pekerjaan untuk mendapatkannya.

Saya menggunakan editor komersial (Visual Slick Edit, yang dianggap mahal oleh mereka yang tidak menghargai waktu mereka sebanyak yang saya lakukan) untuk masalah ini. Eclipse dengan plugin CDT adalah cara open source untuk pergi yang memiliki banyak pengikut. (Tidak baik untuk saya karena saya sering membutuhkan dukungan ADA)

Apa yang tidak saya lakukan adalah mencoba merekayasa makefile menjadi semacam proyek. Saya menggunakan sistem IDE build in dan secara manual menambah / menghapus file sesuai kebutuhan. Saya yakin saya bisa skrip itu, tetapi waktunya mungkin tidak sepadan. Untuk ini saya menemukan gerhana sedikit kurang dapat digunakan daripada Slickedit (Itu bisa dengan mudah (dan mungkin sudah) berubah sejak saya terakhir melihat)

Linux memiliki banyak sekali alat, orang-orang yang tahu benar-benar unggul dalam semua aspek pengeditan, ia memiliki referensi pencarian dll, hanya kurva belajar yang curam. Saya yakin Emacs dapat melakukan semuanya juga, meskipun belum pernah menggunakannya.

mattnz
sumber
3
"Masalah Anda telah terpecahkan berkali-kali di dunia Linux, namun, tidak seperti alat Windows / Microsoft, itu tidak akan diserahkan pada piring perak dengan lauk tambahan." Jadi itu belum terpecahkan sepenuhnya.
quant_dev
4
@quant_dev. Benar atau salah, itu tidak biasa untuk sepotong perangkat lunak Linux mencoba menjadi segalanya bagi setiap pengguna. Adalah lebih umum untuk memiliki model di mana setiap bagian melakukan hal kecil dengan baik, dan pengguna akhir mengumpulkan apa yang dibutuhkan olehnya untuk menyelesaikan masalahnya. Untuk pengguna windows, masalahnya tidak dianggap diselesaikan, untuk pengguna Linux, itu, siapa yang benar, jelas Anda pikir Anda, saya tidak tahu, dan sebagian besar pengguna Linux berpikir begitu. Agak sulit memberi saya -1 hanya karena tidak setuju dengan cara dunia ini.
mattnz
3

Untuk apa nilainya, di Linux Anda memiliki sistem pembangunan yang lebih baik daripada GNU tua biasa (yang sering berjalan dengan autoconf yang mengerikan ), misalnya omake dan banyak lainnya ( cmake, scons...).

Basile Starynkevitch
sumber
3

satu saran mengenai betapa membosankannya menggunakan grep untuk mencari kode: setel alias bash di file .bashrc Anda. Jadi itu hanya satu perintah:

alias searchCode='find -iname \*.cpp | xargs grep $1'
alias searchCodeHeaders='find -iname \*.h | xargs grep $1'

mungkin ada cara yang lebih baik untuk menulis perintah, tetapi idenya sama. Ingin kode pencarian? tulis alias yang disebut searchCode. Ingat bahwa meskipun membosankan dan rumit, alat unix juga dapat digunakan untuk membuat hidup Anda lebih mudah.

Timmah
sumber
3

2c saya sebagai seseorang yang telah mengembangkan C ++ di kedua platform dan menyukai keduanya.

1) Makefiles menyakitkan - saran terbaik yang bisa saya berikan adalah mencoba beralih ke sistem build lain, jika mungkin.

2) Untuk mengedit kode dan menjelajah, ada beberapa alat yang sangat berguna. Tentu, mereka tidak terintegrasi, tetapi itu tidak masalah ketika datang untuk menyelesaikan sesuatu. vim + ctags + grep hanya akan membawa Anda ke sana. Tentu saja, ada IDE juga, tapi terus terang saya tidak suka apa pun yang saya coba: Eclipse + CDT, KDevelop, Code :: Block. Anda mungkin sampai pada kesimpulan yang berbeda.

3) Untuk debugging, cukup ikuti perintah-gdb. Tentu, itu sangat di belakang Windbg ketika datang ke fitur, tetapi untuk sebagian besar tujuan baik-baik saja. Front-end grafis (ddd, KDbg) sangat buggy terakhir kali saya mencobanya, tapi sekali lagi semuanya mungkin telah berubah :)

Intinya adalah - ya Anda perlu melakukan upaya belajar, tetapi setelah itu Anda akan sama produktifnya dengan Anda di Windows.

Nemanja Trifunovic
sumber
Saya sering lari gdbdari dalam emacs(di Linux) dan itu sangat membantu.
Basile Starynkevitch
1

Untuk semua saran bagus yang sudah Anda terima, saya ingin menambahkan beberapa tautan, masing-masing ke ack dan pss .

Mereka ditujukan untuk pemrogram yang harus secara khusus peduli dengan kode sumber, berusaha untuk meningkatkan lebih dari grep.

Francesco
sumber
0

Jawaban yang bagus Menambah mereka,

Ketika saya melakukan langkah ini, kesalahan yang saya lakukan adalah mencoba untuk melompat ke kode tanpa memberikan uji tuntas ke sistem build GNU, yang kembali menggigit saya ketika saya ingin membuat perubahan kode. Luangkan beberapa hari untuk memahami bagaimana AutoMake / AutoConf / Make suite of tools berfungsi, Anda akan sangat cepat setelah itu.

Mengenai alat - Eclipse + CDT / GDB + DDD berjalan sangat jauh.

Subu Sankara Subramanian
sumber
-1

Berikut ini beberapa saran untuk membuatnya bekerja lebih mudah:

  1. Mulai dari awal. Ini berarti Anda akan menggunakan skrip bash sebagai pengganti makefile terlebih dahulu, dan kemudian makefile sederhana setelah Anda membutuhkan dependensi. Tetap sederhana di awal. Makefile Anda tidak perlu menangani 15 platform unix yang berbeda - buat saja kompilasi dengan dependensi. (makefile awal Anda akan terlihat seperti: all: g ++ -o main.cpp utama) (contoh yang lebih kompleks dapat ditemukan dari http://sivut.koti.soon.fi/~terop/Makefile - saat memulai dari awal , cukup salin file ke proyek, ubah nama file, direktori mkdir objs, ubah lib yang Anda inginkan)
  2. Lupakan IDE. Itu hanya akan membuat Anda lebih lambat. Belajar membaca kode dan mengingat hierarki file proyek Anda. Alat perintah biasa seperti 'cd dir' dan 'emacs foo.cpp' harus sangat otomatis sehingga Anda tidak perlu berpikir dua kali untuk mengetiknya.
  3. Lupakan penyorotan dan intellisense. Ini tidak akan bekerja dengan cara yang sama seperti di studio visual, dan petunjuk pemberiannya hanya akan membingungkan Anda karena itu berbeda dari apa yang dulu Anda lakukan. Belajarlah untuk tidak bergantung pada mereka.
  4. Gdb adalah debugger yang bagus. Anda akan mendapatkan tumpukan panggilan. Jangan coba melangkahi kode, itu tidak akan bekerja dengan baik. Gunakan valgrind juga. Breakpoint juga bagus, tapi jangan terlalu mengandalkan mereka; jarang digunakan dengan gdb.
  5. Jika kompilasi Anda lebih dari sekadar 'make' di shell, Anda perlu memikirkan kembali edit-compile-debug-edit -cycle.
  6. Berikut ini trik yang tidak bisa dilakukan oleh studio visual: Tampilkan file header dan .cpp di layar secara bersamaan - sehingga keduanya terlihat tanpa membalik di antara mereka dengan tab. Emacs dapat melakukannya. Jadi bisa notepad. Visual studio atau IDE tidak bisa.
  7. Pelajari emacs keybindings. Ini akan membuat Anda lebih cepat. Petunjuk yang bagus adalah bahwa semua tombol terletak sangat dekat pada keyboard. Urutan perintah lebih panjang, tetapi masih lebih cepat untuk mengetiknya.
  8. Ada trik mudah untuk mengganti go-to-definition: tulis kode ke file yang sama, dan gunakan esc- <dan Cs :: myfunction di emacs untuk menemukan fungsi yang Anda inginkan. Prosesnya berbeda jika Anda terbiasa dengan banyak file pendek - kode Anda akan terlihat berbeda. (pelajari ctrl-f di notepad, dan Anda akan mendapatkan idenya). Tapi Anda pasti tidak perlu melakukannya di shell.
  9. Waktu startup editor teks sangat penting. Jika dibutuhkan lebih dari 1 detik untuk membukanya, itu tidak baik. Setiap IDE rusak karena persyaratan ini. Notepad dan emacs ok.
  10. goto-line di emacs adalah fitur penting untuk pemrograman. Ikat ke beberapa tombol. Saya menggunakan Cx g
tp1
sumber
1
-1 untuk "tulis kode ke file yang sama": Anda pasti bercanda! Dan bagaimana Anda bisa mengakui "Jangan pernah mencoba menginjak kode" dan masih bersikeras bahwa "Gdb adalah debugger yang baik"!
Sjoerd
@sjoerd: Ini hanya teknik yang kami temukan berfungsi dengan baik. Mungkin bukan yang digunakan orang lain, tetapi mereka bekerja dengan baik di lingkungan linux - program yang lebih besar perlu menggunakan file yang lebih besar. Dengan 10 tahun pengalaman dalam pemrograman, ia tidak perlu lagi melangkah dalam kode - ia sudah tahu bagaimana eksekusi program bekerja dan tidak membutuhkan bantuan yang disediakan oleh kode melangkah.
tp1