คำถามติดแท็ก gcc

GCC คือ GNU Compiler Collection มันเป็นคอมไพเลอร์มาตรฐานอย่างแท้จริงสำหรับ C, C ++, Go, Fortran และ Ada บน Linux และรองรับภาษาและแพลตฟอร์มอื่น ๆ อีกมากมายเช่นกัน นอกเหนือจากคอมไพเลอร์ GCC ยังมี toolchain (libc, libstdc ++, objdump, nm ฯลฯ ) ที่ใช้กันอย่างแพร่หลายในหลายแพลตฟอร์มและระบบ

6
จะติดตั้ง GCC ทีละชิ้นด้วย GMP, MPFR, MPC, ELF โดยไม่ใช้ไลบรารีที่ใช้ร่วมกันได้อย่างไร
ฉันจะติดตั้ง GCC (GNU Compiler Collection) ทีละชิ้นได้อย่างไรโดยใช้เวอร์ชันปัจจุบัน โดยใช้การอ้างอิงเวอร์ชันที่ถูกต้องโดยไม่ใช้ตัวจัดการแพ็คเกจ (เช่น yum, rpm, apt, dpkg) และไม่ใช้ไลบรารีที่แชร์ นักพัฒนาทั่วไปมักต้องการติดตั้ง GCC ด้วยวิธีทั่วไปใช้ตัวจัดการแพ็คเกจของคุณ (yum, rpm, apt, dpkg, port, brew ฯลฯ ) หรือทำตามคำแนะนำที่นี่ ( http://gcc.gnu.org/wiki/ การติดตั้ง GCC ) คำถามของฉันคือวิธีติดตั้ง GCC ทีละชิ้นโดยไม่ใช้ไลบรารีที่ใช้ร่วมกัน ฉันต้องการ GCC อิสระเต็มรูปแบบที่สามารถย้ายไปรอบ ๆ ระบบของฉันได้โดยไม่ต้องใช้ไลบรารีที่ใช้ร่วมกันและไม่ต้องสร้างไลบรารีที่แชร์ นี่คือสิ่งที่ GCC เรียกว่า "วิธีที่ยาก" และไม่แนะนำสำหรับผู้ใช้ทั่วไป GCC ขึ้นอยู่กับ: GMP: GNU ไลบรารีเลขคณิตที่แม่นยำหลายรายการ MPFR: GNU …
115 gcc  elf  gmp  mpfr  mpc 

17
ปัญหาการคอมไพล์: ไม่พบ crt1.o
ฉันมีระบบ Debian เสมือนจริงที่ฉันใช้ในการพัฒนา วันนี้อยากลอง llvm / clang หลังจากติดตั้งเสียงดังฉันไม่สามารถรวบรวม c-project เก่าของฉัน (ด้วย gcc) นี่คือข้อผิดพลาด: ... /usr/bin/ld: cannot find crt1.o: No such file or directory /usr/bin/ld: cannot find crti.o: No such file or directory collect2: ld returned 1 exit status ... ฉันถอนการติดตั้งเสียงดังลั่น แต่ก็ยังใช้งานไม่ได้ ใครมีความคิดว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร
115 gcc  clang  ld 

2
มีเจตนาโดยคณะกรรมการมาตรฐาน C ++ หรือไม่ว่าใน C ++ 11 unordered_map ทำลายสิ่งที่แทรก?
ฉันเพิ่งเสียชีวิตไปสามวันในการติดตามข้อผิดพลาดที่แปลกมากที่ unordered_map :: insert () ทำลายตัวแปรที่คุณแทรก ลักษณะการทำงานที่ไม่ชัดเจนนี้เกิดขึ้นในคอมไพเลอร์ล่าสุดเท่านั้น: ฉันพบว่า clang 3.2-3.4 และ GCC 4.8 เป็นคอมไพเลอร์เพียงตัวเดียวที่แสดง "คุณลักษณะ" นี้ นี่คือโค้ดที่ลดลงบางส่วนจากฐานรหัสหลักของฉันซึ่งแสดงให้เห็นถึงปัญหา: #include <memory> #include <unordered_map> #include <iostream> int main(void) { std::unordered_map<int, std::shared_ptr<int>> map; auto a(std::make_pair(5, std::make_shared<int>(5))); std::cout << "a.second is " << a.second.get() << std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout …
114 c++  gcc  c++11  clang  standards 

5
PATH_MAX กำหนดไว้ที่ไหนใน Linux?
ไฟล์ส่วนหัวใดที่ฉันควรเรียกใช้#includeเพื่อให้สามารถใช้ PATH_MAX เป็น int สำหรับปรับขนาดสตริงได้ ฉันต้องการที่จะประกาศ: char *current_path[PATH_MAX]; แต่เมื่อฉันทำเช่นนั้นคอมไพเลอร์ของฉัน (Clang / LLVM บน Linux) ออกข้อผิดพลาดต่อไปนี้: recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX' char *current_path[PATH_MAX]; ^ ฉันลองค้นหาโดย Google แล้ว แต่ก็ยังไม่มีโชค #include <limits.h> ไม่แก้ไขปัญหา / ข้อผิดพลาด ฉันแก้ไขด้วยหรือไม่ว่าค่าของ PATH_MAX เป็น int
113 c  linux  gcc  include  clang 

4
cout ซิงโครไนซ์ / เธรดปลอดภัยหรือไม่?
โดยทั่วไปฉันถือว่าสตรีมไม่ซิงโครไนซ์ขึ้นอยู่กับผู้ใช้ที่จะทำการล็อกที่เหมาะสม อย่างไรก็ตามสิ่งต่างๆเช่นcoutได้รับการดูแลเป็นพิเศษในไลบรารีมาตรฐานหรือไม่ นั่นคือถ้าหลายเธรดเขียนไปcoutพวกเขาสามารถทำให้coutวัตถุเสียหายได้หรือไม่? ฉันเข้าใจดีว่าแม้ว่าจะซิงโครไนซ์แล้วคุณจะยังคงได้รับเอาต์พุตแบบสอดแทรกแบบสุ่ม แต่รับประกันการแทรกสอด นั่นคือปลอดภัยที่จะใช้coutจากหลายเธรดหรือไม่? ขึ้นอยู่กับผู้ขายรายนี้หรือไม่? gcc ทำอะไร? สำคัญ : โปรดระบุข้อมูลอ้างอิงสำหรับคำตอบของคุณหากคุณตอบว่า "ใช่" เนื่องจากฉันต้องการหลักฐานบางอย่างเกี่ยวกับเรื่องนี้ ข้อกังวลของฉันไม่ได้เกี่ยวกับการเรียกระบบพื้นฐานซึ่งเป็นสิ่งที่ดี แต่สตรีมเพิ่มชั้นของการบัฟเฟอร์ที่ด้านบน
112 c++  gcc  c++11 

11
จะลบสัญลักษณ์ C / C ++ ที่ไม่ได้ใช้ด้วย GCC และ ld ได้อย่างไร?
ฉันต้องการปรับขนาดของไฟล์ปฏิบัติการของฉันให้เหมาะสมอย่างรุนแรง ( ARMการพัฒนา) และฉันสังเกตเห็นว่าในรูปแบบการสร้างปัจจุบัน ( gcc+ ld) สัญลักษณ์ที่ไม่ได้ใช้ของฉันจะไม่ถูกตัดออก การใช้งานของarm-strip --strip-unneededสำหรับที่เกิด executables / ห้องสมุดไม่เปลี่ยนขนาดการส่งออกของปฏิบัติการที่(ผมมีความคิดว่าทำไมไม่มีบางทีมันก็ไม่ได้) จะเป็นอย่างไร(ถ้ามี)ในการแก้ไขไปป์ไลน์อาคารของฉันเพื่อให้สัญลักษณ์ที่ไม่ได้ใช้ถูกดึงออกจากไฟล์ผลลัพธ์ ฉันจะไม่นึกถึงสิ่งนี้ด้วยซ้ำ แต่สภาพแวดล้อมที่ฝังอยู่ในปัจจุบันของฉันไม่ได้ "ทรงพลัง" มากนักและประหยัดได้แม้จะ500Kไม่ได้2Mผลลัพธ์ในการเพิ่มประสิทธิภาพการโหลดที่ดีมาก อัปเดต: น่าเสียดายที่gccเวอร์ชันปัจจุบันที่ฉันใช้ไม่มี-dead-stripตัวเลือกและ-ffunction-sections... + --gc-sectionsสำหรับldไม่ได้ให้ความแตกต่างอย่างมีนัยสำคัญสำหรับผลลัพธ์ที่ได้ ฉันตกใจมากที่เรื่องนี้กลายเป็นปัญหาเพราะฉันแน่ใจว่าgcc + ldควรดึงสัญลักษณ์ที่ไม่ได้ใช้ออกโดยอัตโนมัติ (ทำไมพวกเขาถึงต้องเก็บไว้?)
111 c++  c  gcc  ld  strip 

4
ฉันจะเชื่อมโยงไปยังเวอร์ชัน glibc เฉพาะได้อย่างไร
เมื่อฉันรวบรวมบางสิ่งบนพีซี Ubuntu Lucid 10.04 ของฉันมันจะเชื่อมโยงกับ glibc Lucid ใช้ glibc 2.11 เมื่อฉันเรียกใช้ไบนารีนี้บนพีซีเครื่องอื่นที่มี glibc รุ่นเก่าคำสั่งล้มเหลวโดยบอกว่าไม่มี glibc 2.11 ... เท่าที่ฉันรู้ glibc ใช้การกำหนดเวอร์ชันสัญลักษณ์ ฉันบังคับให้ gcc เชื่อมโยงกับเวอร์ชันสัญลักษณ์เฉพาะได้หรือไม่ ในการใช้งานจริงของฉันฉันพยายามรวบรวม gcc cross toolchain สำหรับ ARM
111 linux  gcc  linker  glibc  libc 


3
เหตุใดไบนารีสองโปรแกรมที่มีเฉพาะความคิดเห็นจึงไม่เปลี่ยนไปตรงกับใน gcc
ฉันสร้างโปรแกรม C สองโปรแกรม โปรแกรม 1 int main() { } โปรแกรม 2 int main() { //Some Harmless comments } AFAIK เมื่อรวบรวมคอมไพเลอร์ (gcc) ควรละเว้นความคิดเห็นและพื้นที่สีขาวที่ซ้ำซ้อนและด้วยเหตุนี้ผลลัพธ์จึงต้องใกล้เคียงกัน แต่เมื่อฉันตรวจสอบ md5sums ของไบนารีเอาต์พุตมันไม่ตรงกัน ฉันลองรวบรวมด้วยการเพิ่มประสิทธิภาพ-O3แล้ว-Ofastแต่ก็ยังไม่ตรงกัน เกิดอะไรขึ้นที่นี่? แก้ไข: คำสั่งที่แน่นอนและมี md5sums คือ (t1.c คือโปรแกรม 1 และ t2.c คือโปรแกรม 2) gcc ./t1.c -o aaa gcc ./t2.c -o bbb 98c1a86e593fd0181383662e68bac22f aaa c10293cbe6031b13dc6244d01b4d2793 bbb …

18
strlen จะถูกคำนวณหลายครั้งหากใช้ในเงื่อนไขการวนซ้ำ?
ฉันไม่แน่ใจว่าโค้ดต่อไปนี้อาจทำให้เกิดการคำนวณซ้ำซ้อนหรือเป็นรหัสเฉพาะของคอมไพเลอร์ for (int i = 0; i < strlen(ss); ++i) { // blabla } จะstrlen()คำนวณทุกครั้งเมื่อiเพิ่มขึ้น?
109 c++  c  gcc  optimization  strlen 

3
-fPIC หมายถึงอะไรเมื่อสร้างไลบรารีที่ใช้ร่วมกัน
ฉันรู้ว่า-fPICตัวเลือก '' เกี่ยวข้องกับการแก้ไขที่อยู่และความเป็นอิสระระหว่างแต่ละโมดูล แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร คุณสามารถอธิบาย?
109 c++  c  gcc  fpic 

8
การลิงก์แบบคงที่เฉพาะบางไลบรารี
ฉันจะลิงก์เฉพาะไลบรารีเฉพาะบางส่วนกับไบนารีของฉันได้อย่างไรเมื่อเชื่อมโยงกับ GCC gcc ... -static ...พยายามเชื่อมโยงไลบรารีที่เชื่อมโยงทั้งหมดแบบคงที่แต่ฉันไม่มีเวอร์ชันคงที่ของบางไลบรารี (เช่น libX11)


11
ข้อผิดพลาดในการคอมไพล์ GCC ด้วยรหัส> 2 GB
ฉันมีฟังก์ชั่นจำนวนมากรวมประมาณ 2.8 GB ของรหัสวัตถุ (น่าเสียดายที่ไม่มีวิธีการคำนวณทางวิทยาศาสตร์ ... ) เมื่อฉันพยายามที่จะเชื่อมโยงพวกเขาก็จะได้รับ (คาดว่า) relocation truncated to fit: R_X86_64_32Sข้อผิดพลาดที่ผมหวังว่าจะหลีกเลี่ยงโดย specifing -mcmodel=mediumธงคอมไพเลอร์ ไลบรารีทั้งหมดที่เชื่อมโยงนอกเหนือจากที่ฉันควบคุมจะถูกคอมไพล์ด้วย-fpicแฟล็ก ถึงกระนั้นข้อผิดพลาดยังคงมีอยู่และฉันคิดว่าบางไลบรารีที่ฉันเชื่อมโยงไม่ได้คอมไพล์ด้วย PIC นี่คือข้อผิดพลาด: /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini' defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS) /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x19): relocation truncated to fit: R_X86_64_32S against …
108 c++  c  gcc  compiler-errors 

3
จะป้องกันไม่ให้ gcc เพิ่มประสิทธิภาพข้อความบางส่วนใน C ได้อย่างไร?
ในการทำให้หน้าสกปรก (การเปิดบิตสกปรกในรายการตารางหน้า) ฉันแตะไบต์แรกของหน้าดังนี้: pageptr[0] = pageptr[0]; แต่ในทางปฏิบัติ gcc จะเพิกเฉยต่อคำสั่งโดยการกำจัดร้านค้าที่ตายแล้ว เพื่อป้องกันไม่ให้ gcc ปรับให้เหมาะสมฉันเขียนคำสั่งใหม่ดังนี้: volatile int tmp; tmp = pageptr[0]; pageptr[0] = tmp; ดูเหมือนว่าเคล็ดลับจะใช้งานได้ แต่ค่อนข้างน่าเกลียด ฉันต้องการทราบว่ามีคำสั่งหรือไวยากรณ์ใดที่มีผลเหมือนกันหรือไม่? และฉันไม่ต้องการใช้-O0ธงเพราะมันจะนำมาซึ่งโทษประสิทธิภาพที่ดีเช่นกัน
108 c  gcc 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.