จะจัดการโครงการ Linux / makefile ขนาดใหญ่ได้อย่างมีประสิทธิภาพได้อย่างไร


16

ฉันพัฒนาแอพพลิเคชั่น Windows ใน C ++ มานานกว่า 10 ปีแล้ว และเมื่อไม่นานมานี้ฉันเริ่มขุดลงไปในบางโครงการของ Linux และฉันก็ทนไม่ได้ว่าฉันเป็นคนที่ไม่ก่อผล ...

ฉันเป็นผู้เรียนที่รวดเร็วและฉันใช้ Linux เป็นแพลตฟอร์มหลักมาระยะหนึ่งแล้ว และฉันรู้สึกสะดวกสบายกับเชลล์หลักการของระบบปฏิบัติการและ GUI แต่เมื่อพูดถึงพัฒนาการฉันรู้สึกเหมือนได้กลับไปโรงเรียน

ทันทีที่ฉันเปิดโครงการขนาดใหญ่ขึ้นฉันติดอยู่ ส่วนใหญ่เป็นไฟล์ makefile ดังนั้นโดยพื้นฐานแล้วเมื่อฉันพยายามนำทางพวกเขาด้วย QT หรือ CodeBlocks อย่างดีที่สุดฉันสามารถใช้ระบบ Intellisense ในแต่ละไฟล์ และตัวแปรส่วนใหญ่เวลารั่วไหลจากขอบเขต

จากนั้นมีสิ่งที่เป็นข้อกำหนดซึ่งดูเหมือนไม่มีอยู่ลองเข้าร่วมโครงการขนาดใหญ่จากแหล่งข้อมูลและคุณติดอยู่หลายวันเพราะการนำทางสู่คำจำกัดความยากมาก ... grep -r "this_def" . --include "*.cpp" --include "*.h"ดูเหมือนจะช้าและเงอะงะ

และจากนั้นการดีบัก gdb ทำงานได้ แต่ไม่ว่าฉันจะทำอะไรดูเหมือนว่าจะเป็นปีหลัง WinDbg หรือ VisualStudio ดีบั๊ก

และสิ่งเหล่านี้ทำให้ฉันหมดหวังฉันต้องการเขียนโค้ด แต่มันช้ามาก ... ฉันเริ่มคิดว่านักพัฒนา Linux เรียนรู้คำจำกัดความของฟังก์ชั่นด้วยหัวใจและวิเคราะห์รหัสด้วยตา แต่ฉันไม่อยากจะเชื่อเลย ดังนั้น.

มีใครเคยผ่านเรื่องนี้บ้าง? มีบางอย่างที่ฉันขาดไปซึ่งจะทำให้ฉันมีประสิทธิผลมากขึ้นหรือไม่?


8
+1, ฉันได้มาถึงข้อสรุปเดียวกันกับดีบักเกอร์ Visual Studio; IDE อื่น ๆ บนแพลตฟอร์มใด ๆ ไม่มีความสามารถในการตรวจสอบ
Aphex

คำตอบ:


22

ที่น่าสนใจพอฉันมีปัญหาเดียวกันในทิศทางตรงกันข้ามเป็นระยะ ฉันเป็น coder UNIX เป็นหลัก แต่ฉันต้องทำการพอร์ตสิ่งต่าง ๆ ไปยัง Windows เป็นระยะ ฉันไม่สามารถบอกจำนวนครั้งที่ฉันต้องการดึงผมออกเพราะฉันไม่พบช่องทำเครื่องหมายที่เหมาะสมสำหรับตัวเลือกคอมไพเลอร์ที่ฝังอยู่ในหนึ่งใน 35 หน้าการตั้งค่าสำหรับโครงการ ฉันต้องการเปิดไฟล์ proj และเพิ่ม XML ด้วยตัวเอง

ความลับคือการมีความอดทนและเรียนรู้ชุดเครื่องมือสำหรับแพลตฟอร์มที่คุณพยายามจะทำงานแน่นอนว่าคุณจะรู้สึกหงุดหงิดใหม่และไม่คุ้นเคยและคุณจะไม่คุ้นเคยกับสถานะใหม่ ทั้งหมดอีกครั้ง ไม่มีวิธีหลีกเลี่ยงสิ่งนี้

ในกรณีเฉพาะของคุณมีเครื่องมือเพิ่มเติมที่คุณควรระวัง ที่แรกก็คือDDDซึ่งเป็น GUI ส่วนหน้าสำหรับ gdb มันไม่ลื่นเหมือน Visual Studio แต่มันจะจับมือคุณ อย่างไรก็ตามฉันขอแนะนำให้กัดสัญลักษณ์แสดงหัวข้อย่อยและตั้งค่าเกี่ยวกับการเรียนรู้ส่วนลึกของ gdb ในความเป็นจริงถ้าคุณเป็นผู้ใช้ปกติไม่มีความแตกต่างระหว่างการท่องจำคำสั่งที่จะพิมพ์ vs ท่องจำกล่องโต้ตอบที่คุณต้องนำมาเปลี่ยนการตั้งค่า

นอกจากนี้คุณยังต้องรู้เกี่ยวกับเครื่องมือเช่นcscopeและctags เท่าที่คุณอาจต้านทานผมจะแนะนำการเรียนรู้เป็นกลุ่มหรือEMACS พวกเขาทำงานร่วมกันได้ดีกับเครื่องมือแท็กที่ฉันเพิ่งพูดถึง เมื่ออยู่ในโรมทำตามที่ชาวโรมันทำ คุณสามารถค้นหาส่วนขยายสำหรับ VIM และ EMACS ที่จะทำโค้ดให้คุณให้สมบูรณ์ ประสบการณ์ของฉันกับเครื่องมือที่ให้รหัสเสร็จคือว่าใช่มันช่วยประหยัดการพิมพ์ แต่ในการพิมพ์ทั่วไปนั้นง่าย การคิดเป็นสิ่งที่ยาก ความคิดเห็นของคุณอาจแตกต่างกันโดยเฉพาะถ้าคุณมีโรค carpal อุโมงค์

สำหรับการทำ ทำให้เป็นที่น่ากลัว แต่คุณอาจจะต้องดูดมันและเรียนรู้


6
+1, การจดจำคำสั่งนั้นไม่ยากกว่าการท่องจำ GUI
Javier

5
เรียนรู้ VIM หรือ EMACS อย่างแน่นอน เหตุผลที่ linux ไม่มี GUI เหมือน Visual Studio ก็เพราะว่า VIM และ EMACS มีคุณสมบัติเหมือนกันทั้งหมดและอื่น ๆ อีกมากมาย ฉันมีสำเนาของฉัน VIM ตั้งค่าการใช้ชุดของปลั๊กอินที่ให้ฉัน autocompletion กับแท็บตัวอย่างนำทางโครงการที่สร้างขึ้นใน terminal, แท็กนำทางแท็กช่องว่างการแปลงและหลังเรื่องทั้งหมดขึ้นอยู่กับGitHub ที่ทำงานฉันใช้ windows แต่นั่นคือสิ่งที่ข้อมูลการใช้เส้นทางในไฟล์ vimrc
Spencer Rathbun

2
@Javier ครั้งล่าสุดที่ฉันตรวจสอบ GUIs แสดงฟังก์ชั่นมากมายในสายตาธรรมดาไม่จำเป็นต้องจำ หน้าจอ VIM นั้นปราศจากคำแนะนำหรือการเตือนใด ๆ
quant_dev

2
@ ผู้ส่งอีเมลฉันเห็นรหัส Linux เพียงพอในเวลาที่จะโทรหา BS ในเรื่องนั้น
quant_dev

4
@quant_dev รวดเร็ว! คุณจะตั้งค่าตัวเลือก linker เพื่อรักษาสัญลักษณ์ที่ซ้ำกันเป็นข้อผิดพลาดได้อย่างไร? แน่นอนว่าคุณสามารถค้นหาได้โดยสำรวจรายการทั้งหมดในส่วนตัวเชื่อมโยงของคุณสมบัติ C / C ++ ของโครงการ แต่นั่นไม่ใช่เรื่องธรรมดา (หรือน้อยกว่า) ในสายตาธรรมดากว่ามองหามันในหน้า man สำหรับ linker
Charles E. Grant

11

ฉันพัฒนาแอพพลิเคชั่น Windows ใน C ++ มานานกว่า 10 ปีแล้ว และเมื่อไม่นานมานี้ฉันเริ่มขุดลงไปในบางโครงการของ Linux และฉันก็ทนไม่ได้ว่าฉันเป็นคนที่ไม่ก่อผล ...

มีบางอย่างที่ฉันขาดไปซึ่งจะทำให้ฉันมีประสิทธิผลมากขึ้นหรือไม่?

พัฒนาบน Windows ปรับใช้บน Linux

ซึ่งรวมถึงการทดสอบหน่วยที่รันอยู่ทั้งบนเครื่องของคุณเอง (Windows) และบนบิลด์เซิร์ฟเวอร์ (Linux)

ในฐานะที่เป็นผลข้างเคียงคุณจะได้เรียนรู้วิธีเขียนโค้ดแบบพกพา

ผลบวกอีกประการหนึ่งคือการใช้คอมไพเลอร์ต่างกันจะสร้างคำเตือนมากขึ้นและจับข้อบกพร่องได้มาก

UPDATE : สำหรับ Linux fanboys downvoting คำตอบนี้: ฉันไม่ได้บอกว่าทุกคนควรพัฒนาบน Windows! แต่การใช้แพลตฟอร์มที่คุณรู้ดีนั้นมีประสิทธิผลมากกว่าการใช้เวลามากมายในการเรียนรู้แพลตฟอร์มใหม่


ผู้ลงคะแนนเสียงได้โปรดระบุว่าทำไมเขาจึงลงคะแนน?
Sjoerd

ฉันเดาว่าคงเป็นเพราะคุณไม่ได้ตอบคำถาม ปัญหากำลังทำงานกับโครงการ linux ที่มีอยู่ ย้ายพอร์ตไปยัง Windows ก่อนแล้วจึงกลับไม่ใช่โซลูชันที่ทำงานได้
tdammers

-1: ถ้าเป็นตัวเลือก OP จะไม่มีปัญหาดั้งเดิมของเขา และการพัฒนาบน Windows จะทำให้คุณได้รับค่าใช้จ่ายทั้งหมดในการพัฒนา Windows (เช่นขั้นตอนการติดตั้งซอฟต์แวร์ในศตวรรษที่ 18 ที่น่ากลัว) และคุณยังต้องเขียน Makefile และข้ามการดีบักแอปพลิเคชันของคุณด้วย gdb
thiton

@tdammers การตรวจสอบแหล่งที่มาและการสร้างโครงการจาก * .cpp ทำงานได้ในหลายกรณี แม้ว่าจะใช้เวลาสองสามชั่วโมงในการตั้งค่า แต่ก็ใช้เวลาน้อยกว่าการเรียนรู้สภาพแวดล้อมการพัฒนาที่แตกต่างกันโดยสิ้นเชิง
Sjoerd

1
ในทางกลับกันการเรียนรู้เพิ่มเติมเกี่ยวกับแพลตฟอร์มที่คุณควรดำเนินการดูเหมือนจะเป็นธรรมชาติและคุ้มค่า
Basile Starynkevitch

4

ปัญหาของคุณได้รับการแก้ไขหลายครั้งในโลก Linux อย่างไรก็ตามไม่เหมือนกับเครื่องมือ Windows / Microsoft มันจะไม่ถูกส่งไปที่จานสีเงินพร้อมกับเครื่องเสริมพิเศษ คุณอาจต้องทำงานบางอย่างเพื่อให้ได้มา

ฉันใช้ตัวแก้ไขเชิงพาณิชย์ (Visual Slick Edit ซึ่งถือว่าแพงโดยผู้ที่ไม่ให้ความสำคัญกับเวลาเท่าที่ฉันทำ) สำหรับปัญหานี้ Eclipse พร้อมด้วยปลั๊กอิน CDT เป็นวิธีโอเพนซอร์ซที่สามารถทำสิ่งต่อไปนี้ได้อย่างมากมาย (ไม่ดีสำหรับฉันเพราะฉันมักต้องการการสนับสนุน ADA)

สิ่งที่ฉันไม่ทำคือพยายามที่จะทำวิศวกรรมย้อนกลับให้เป็นโครงการบางประเภท ฉันใช้บิลด์ของ IDE ในระบบและเพิ่ม / ลบไฟล์ด้วยตนเองตามต้องการ ฉันแน่ใจว่าฉันสามารถสคริปต์ได้ แต่เวลาอาจไม่คุ้มค่า สำหรับเรื่องนี้ฉันพบว่าคราสใช้งานได้น้อยกว่า Slickedit (นั่นอาจจะง่าย (และอาจจะ)) มีการเปลี่ยนแปลงตั้งแต่ฉันดูครั้งล่าสุด)

ลีนุกซ์มีเครื่องมือมากมาย, ผู้ชายที่รู้จัก vi ทำได้ดีในทุกด้านของการแก้ไข, มันมีการอ้างอิงการค้นหาและอื่น ๆ , เป็นเพียงช่วงการเรียนรู้ที่สูงชัน ฉันมั่นใจว่า Emac สามารถทำได้ทุกอย่างเช่นกันแม้ว่าจะไม่เคยใช้


3
"ปัญหาของคุณได้รับการแก้ไขหลายครั้งในโลก Linux อย่างไรก็ตามไม่เหมือนกับเครื่องมือ Windows / Microsoft มันจะไม่ถูกส่งไปที่จานสีเงินพร้อมกับอุปกรณ์เสริม" ดังนั้นจึงไม่ได้รับการแก้ไขอย่างสมบูรณ์ดังนั้น
quant_dev

4
@quant_dev ไม่ว่าจะถูกหรือผิดก็เป็นเรื่องแปลกสำหรับซอฟต์แวร์ลีนุกซ์พยายามเป็นทุกสิ่งสำหรับผู้ใช้ทุกคน เป็นเรื่องปกติที่จะมีแบบจำลองที่แต่ละชิ้นทำสิ่งเล็ก ๆ น้อย ๆ ได้ดีและผู้ใช้จะรวบรวมสิ่งที่เขาต้องการเพื่อแก้ไขปัญหาของเขา สำหรับผู้ใช้งาน windows ปัญหาไม่ได้รับการพิจารณาแก้ไขสำหรับผู้ใช้ Linux มันคือใครถูกต้องแน่นอนคุณคิดว่าคุณเป็นฉันไม่รู้และผู้ใช้ Linux ส่วนใหญ่คิดว่าพวกเขาเป็น มันค่อนข้างรุนแรงให้ฉัน -1 เพียงเพราะไม่เห็นด้วยกับวิธีการที่โลกเป็น
mattnz


3

คำแนะนำหนึ่งข้อเกี่ยวกับวิธีที่น่าเบื่อในการใช้ grep เพื่อค้นหารหัส: ตั้งค่า bash aliases ในไฟล์. bashrc ของคุณ ดังนั้นมันจึงเป็นเพียงคำสั่งเดียว:

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

อาจมีวิธีที่ดีกว่าในการเขียนคำสั่ง แต่ความคิดก็เหมือนกัน ต้องการค้นหารหัส? เขียนนามแฝงที่เรียกว่า searchCode โปรดจำไว้ว่าแม้ว่าพวกเขาจะน่าเบื่อและซับซ้อน แต่เครื่องมือยูนิกซ์ก็สามารถใช้เพื่อทำให้ชีวิตของคุณง่ายขึ้น


3

2c ของฉันเป็นคนที่พัฒนา C ++ บนทั้งสองแพลตฟอร์มและชอบพวกเขาทั้งคู่

1) Makefiles นั้นเจ็บปวด - คำแนะนำที่ดีที่สุดที่ฉันสามารถให้คุณได้คือลองเปลี่ยนไปใช้ระบบ build อื่นหากเป็นไปได้

2) สำหรับการแก้ไขรหัสและการเรียกดูมีเครื่องมือที่มีประโยชน์มาก แน่นอนว่ามันไม่ได้ถูกรวมเข้าด้วยกัน แต่มันไม่สำคัญเลยเมื่อพูดถึงการทำสิ่งต่างๆให้สำเร็จ เป็นกลุ่ม + ctags + grep จะพาคุณไปที่นั่น แน่นอนว่ามี IDEs เช่นกัน แต่ตรงไปตรงมาฉันไม่ชอบอะไรที่ฉันลอง: Eclipse + CDT, KDevelop, Code :: Block คุณอาจได้ข้อสรุปที่แตกต่างออกไป

3) สำหรับการดีบั๊กเพียงติดกับบรรทัดคำสั่ง gdb แน่นอนว่ามันค่อนข้างล้าหลัง Windbg เมื่อพูดถึงคุณสมบัติ แต่สำหรับจุดประสงค์ส่วนใหญ่มันก็ใช้ได้ กราฟิก front-end (ddd, KDbg) ค่อนข้างน่าเบื่อในครั้งสุดท้ายที่ฉันลองใช้ แต่สิ่งต่าง ๆ อาจมีการเปลี่ยนแปลง :)

บรรทัดล่างคือ - ใช่คุณต้องใช้ความพยายามในการเรียนรู้ แต่หลังจากนั้นคุณจะมีประสิทธิภาพเท่าที่คุณใช้บน Windows


ฉันมักจะเรียกใช้gdbจากภายในemacs(บน Linux) และมันช่วยได้มาก
Basile Starynkevitch

1

สำหรับคำแนะนำที่ดีทั้งหมดที่คุณได้รับฉันต้องการเพิ่มลิงก์สองสามรายการตามลำดับเพื่อ ackและps PSS

พวกเขามีวัตถุประสงค์เพื่อโปรแกรมเมอร์ที่ต้องใส่ใจเป็นพิเศษเกี่ยวกับซอร์สโค้ดพยายามที่จะปรับปรุงมากกว่า grep


0

คำตอบที่ดี เพิ่มไปยังพวกเขา

เมื่อฉันทำสิ่งนี้ความผิดพลาดที่ฉันทำคือพยายามกระโดดเข้าไปในโค้ดโดยไม่ให้ความขยันเนื่องจากระบบการสร้างของ GNU ซึ่งกลับมากัดฉันเมื่อฉันต้องการเปลี่ยนรหัส ใช้เวลาสองสามวันในการทำความเข้าใจว่าชุดเครื่องมือ AutoMake / AutoConf / Make ทำงานอย่างไรคุณจะได้อย่างรวดเร็วหลังจากนั้น

เกี่ยวกับเครื่องมือ - Eclipse + CDT / GDB + DDD ไปไกลแน่นอน


-1

ต่อไปนี้เป็นคำแนะนำในการทำให้การทำงานง่ายขึ้น:

  1. เริ่มจากจุดเริ่มต้น ซึ่งหมายความว่าคุณจะใช้ bash script แทน makefile ก่อนจากนั้นจึงสร้าง makefiles ง่าย ๆ เมื่อคุณต้องการการพึ่งพา ทำให้มันง่ายที่จุดเริ่มต้น makefile ของคุณไม่จำเป็นต้องจัดการกับ 15 แพลตฟอร์มยูนิกซ์ที่แตกต่างกัน - เพียงแค่ทำให้มันรวบรวมด้วยการอ้างอิง (makefile เริ่มต้นของคุณจะมีลักษณะดังนี้: all: g ++ -o main main.cpp) (ตัวอย่างที่ซับซ้อนมากขึ้นสามารถพบได้จากhttp://sivut.koti.soon.fi/~terop/Makefile - เมื่อเริ่มต้นจากศูนย์ เพียงแค่คัดลอกไฟล์ไปยังโครงการเปลี่ยนชื่อไฟล์ไดเรกทอรี mkdir objs เปลี่ยน libs ที่คุณต้องการ)
  2. ลืม IDE มันจะทำให้คุณช้าลงเท่านั้น เรียนรู้การอ่านรหัสและจดจำลำดับชั้นไฟล์ของโครงการของคุณ เครื่องมือบรรทัดคำสั่งปกติเช่น 'cd dir' และ 'emacs foo.cpp' จะต้องเป็นไปโดยอัตโนมัติจนคุณไม่คิดว่าจะพิมพ์ซ้ำสองครั้ง
  3. ลืมการเน้นไวยากรณ์และ Intellisense มันจะไม่ทำงานแบบเดียวกับที่ใช้ในสตูดิโอภาพและคำแนะนำที่ให้จะทำให้คุณสับสนเพราะแตกต่างจากที่คุณเคยทำ เรียนรู้ที่จะไม่พึ่งพาพวกเขา
  4. Gdb เป็นตัวดีบั๊ก คุณจะได้รับสแต็คการโทร อย่าแม้แต่พยายามก้าวไปรอบ ๆ โค้ดมันจะไม่ทำงานได้ดีนัก ใช้ valgrind ด้วย เบรกพอยต์ก็ดีเช่นกัน แต่อย่าพึ่งพามากเกินไป ใช้ไม่ค่อยได้กับ gdb เท่านั้น
  5. หากการคอมไพล์ของคุณเป็นอย่างอื่นนอกจาก 'สร้าง' ในเชลล์คุณต้องคิดใหม่ edit-compile-debug-edit -cycle
  6. นี่คือเคล็ดลับที่ Visual Studio ไม่สามารถทำได้: แสดงทั้งไฟล์ส่วนหัวและไฟล์. cpp บนหน้าจอในเวลาเดียวกัน - เพื่อให้ทั้งคู่มองเห็นได้โดยไม่ต้องพลิกระหว่างแท็บ Emacs สามารถทำได้ ดังนั้นสามารถจดบันทึก Visual studio หรือ IDE ไม่สามารถทำได้
  7. เรียนรู้ emacs keybindings มันจะทำให้คุณเร็วขึ้น คำแนะนำที่ดีคือปุ่มทั้งหมดอยู่ใกล้กับคีย์บอร์ดมาก ลำดับของคำสั่งนั้นยาวกว่า แต่ก็ยังพิมพ์ได้เร็วกว่า
  8. มีเคล็ดลับง่าย ๆ ในการแทนที่ go-to-definition: เขียนโค้ดเป็นไฟล์เดียวกันและใช้ esc- <และ Cs :: myfunction ใน emacs เพื่อค้นหาฟังก์ชันที่คุณต้องการ กระบวนการนี้จะแตกต่างกันหากคุณเคยชินกับไฟล์สั้น ๆ มากมาย - รหัสของคุณจะเปลี่ยนไป (เรียนรู้ ctrl-f ในแผ่นจดบันทึกและคุณจะได้รับความคิด) แต่แน่นอนคุณไม่จำเป็นต้องทำในเปลือก
  9. เวลาเริ่มต้นตัวแก้ไขข้อความมีความสำคัญมาก หากใช้เวลานานกว่า 1 วินาทีเพื่อเปิดมันก็ไม่ดี IDE ทุกตัวถูกทำลายเนื่องจากข้อกำหนดนี้ Notepad และ emacs ก็โอเค
  10. goto-line ใน emacs เป็นคุณสมบัติที่สำคัญสำหรับการเขียนโปรแกรม ผูกไว้กับกุญแจ ฉันใช้ Cx g

1
-1 สำหรับ "เขียนรหัสเป็นไฟล์เดียวกัน": คุณต้องล้อเล่น! และคุณจะยอมรับได้อย่างไรว่า "อย่าพยายามก้าวไปรอบ ๆ โค้ด" และยังยืนยันว่า "Gdb เป็นตัวดีบั๊ก"!
Sjoerd

@sjoerd: นี่เป็นเพียงเทคนิคที่เราพบว่าทำงานได้อย่างถูกต้อง อาจไม่ใช่สิ่งที่คนอื่นใช้ แต่ทำงานได้ดีในสภาพแวดล้อม linux - โปรแกรมขนาดใหญ่จำเป็นต้องใช้ไฟล์ที่มีขนาดใหญ่ขึ้น ด้วยประสบการณ์ 10 ปีในการเขียนโปรแกรมเขาไม่จำเป็นต้องก้าวไปข้างหน้าในโค้ดอีกต่อไปแล้วเขารู้วิธีการทำงานของโปรแกรมและไม่ต้องการความช่วยเหลือจากการก้าวผ่านโค้ด
tp1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.