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

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

12
ทำไม GCC จึงไม่ปรับ a * a * a * a * a ถึง (a * a * a) * (a * a * a)?
ฉันกำลังทำการเพิ่มประสิทธิภาพเชิงตัวเลขในแอปพลิเคชันทางวิทยาศาสตร์ สิ่งหนึ่งที่ฉันสังเกตเห็นคือ GCC จะเพิ่มประสิทธิภาพการโทรpow(a,2)โดยรวบรวมมันเข้าไปa*aแต่การโทรpow(a,6)นั้นไม่ได้รับการปรับปรุงและจะเรียกฟังก์ชั่นห้องสมุดpowซึ่งทำให้ประสิทธิภาพช้าลงอย่างมาก (ตรงกันข้ามIntel C ++ Compiler ที่สามารถเรียกทำงานiccได้จะกำจัดการเรียกใช้ไลบรารีpow(a,6)) สิ่งที่ฉันอยากรู้คือเมื่อฉันแทนที่pow(a,6)ด้วยการa*a*a*a*a*aใช้ GCC 4.5.1 และตัวเลือก " -O3 -lm -funroll-loops -msse4" จะใช้ 5 mulsdคำสั่ง: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 ในขณะที่ถ้าฉันเขียน(a*a*a)*(a*a*a)มันจะผลิต movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd …

23
รวบรวมแอปพลิเคชันสำหรับใช้ในสภาพแวดล้อมที่มีกัมมันตภาพรังสีสูง
เรากำลังรวบรวมโปรแกรมฝัง C / C ++ ที่ถูกนำไปใช้ในอุปกรณ์ป้องกันในสภาพแวดล้อมที่ถล่มด้วยรังสี เรากำลังใช้ GCC และการคอมไพล์ข้ามสำหรับ ARM เมื่อนำไปใช้งานแอปพลิเคชันของเราจะสร้างข้อมูลที่ผิดพลาดและล่มบ่อยกว่าที่เราต้องการ ฮาร์ดแวร์ออกแบบมาสำหรับสภาพแวดล้อมนี้และแอปพลิเคชันของเราทำงานบนแพลตฟอร์มนี้มาหลายปี มีการเปลี่ยนแปลงที่เราสามารถทำกับรหัสของเราหรือการปรับปรุงเวลาคอมไพล์ที่สามารถทำเพื่อระบุ / แก้ไขข้อผิดพลาดที่อ่อนนุ่มและความเสียหายของหน่วยความจำที่เกิดจากเหตุการณ์เดียวพลิกคว่ำ ? นักพัฒนาซอฟต์แวร์รายอื่นประสบความสำเร็จในการลดผลกระทบที่เป็นอันตรายของข้อผิดพลาดที่อ่อนนุ่มในแอพพลิเคชั่นที่ทำงานนานหรือไม่?
1456 c++  c  gcc  embedded  fault-tolerance 

27
ข้อผิดพลาดร้ายแรง: Python.h: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฉันพยายามสร้างไลบรารี่ที่แชร์โดยใช้ไฟล์นามสกุล C แต่ก่อนอื่นฉันต้องสร้างไฟล์เอาต์พุตโดยใช้คำสั่งด้านล่าง: gcc -Wall utilsmodule.c -o Utilc หลังจากรันคำสั่งฉันได้รับข้อความแสดงข้อผิดพลาดนี้: utilsmodule.c: 1: 20: ข้อผิดพลาดร้ายแรง: Python.h: ไม่มีการยกเลิกการรวบรวมไฟล์หรือไดเรกทอรีดังกล่าว ฉันได้ลองวิธีแก้ปัญหาที่แนะนำทั้งหมดทางอินเทอร์เน็ต แต่ปัญหายังคงมีอยู่ Python.hฉันมีปัญหากับไม่มี ฉันจัดการเพื่อค้นหาไฟล์บนเครื่องของฉัน
1191 python  gcc  python-c-api 

5
ทำไมตัวประมวลผลล่วงหน้า C ตีความคำว่า“ linux” เป็นค่าคงที่“ 1”
ทำไมCตัวประมวลผลล่วงหน้าในGCCตีความคำว่าlinux(ตัวอักษรตัวเล็ก) เป็นค่าคงที่1? test.c: #include <stdio.h> int main(void) { int linux = 5; return 0; } ผลลัพธ์ของ $ gcc -E test.c (หยุดหลังจากขั้นตอนการประมวลผลล่วงหน้า): .... int main(void) { int 1 = 5; return 0; } ซึ่งแน่นอนว่าข้อผิดพลาด (BTW: ไม่มี#define linuxในstdio.hไฟล์)
1022 c  linux  gcc  c-preprocessor 


2
เหตุใดโปรแกรมของฉันจึงช้าเมื่อวนลูปมากกว่า 8192 องค์ประกอบ
นี่คือสารสกัดจากโปรแกรมที่เป็นปัญหา เมทริกซ์img[][]มีขนาด SIZE × SIZE และเริ่มต้นได้ที่: img[j][i] = 2 * j + i จากนั้นคุณสร้างเมทริกซ์res[][]และแต่ละฟิลด์ในที่นี้จะถูกทำให้เป็นค่าเฉลี่ยของ 9 ฟิลด์รอบ ๆ มันในเมทริกซ์ img เส้นขอบจะเหลือ 0 เพื่อความเรียบง่าย for(i=1;i<SIZE-1;i++) for(j=1;j<SIZE-1;j++) { res[j][i]=0; for(k=-1;k<2;k++) for(l=-1;l<2;l++) res[j][i] += img[j+l][i+k]; res[j][i] /= 9; } นั่นคือทั้งหมดที่มีให้กับโปรแกรม เพื่อความสมบูรณ์ 'นี่คือสิ่งที่มาก่อน ไม่มีรหัสมา อย่างที่คุณเห็นมันเป็นเพียงการเริ่มต้น #define SIZE 8192 float img[SIZE][SIZE]; // input image float res[SIZE][SIZE]; …

28
วิธีสร้าง stacktrace โดยอัตโนมัติเมื่อโปรแกรมของฉันขัดข้อง
ฉันกำลังทำงานบน Linux ด้วยคอมไพเลอร์ GCC เมื่อโปรแกรม C ++ ของฉันล่มฉันต้องการให้สแต็คสร้างเทรซ โปรแกรมของฉันถูกเรียกใช้โดยผู้ใช้หลายคนและยังทำงานบน Linux, Windows และ Macintosh (ทุกรุ่นรวบรวมโดยใช้gcc) ฉันต้องการให้โปรแกรมของฉันสามารถสร้างการติดตามสแต็กเมื่อเกิดข้อผิดพลาดและในครั้งต่อไปที่ผู้ใช้เรียกใช้มันจะถามพวกเขาว่าการส่งสแต็กติดตามมาให้ฉันได้หรือไม่ดังนั้นฉันจึงสามารถติดตามปัญหาได้ ฉันสามารถจัดการการส่งข้อมูลให้ฉันได้ แต่ฉันไม่รู้วิธีสร้างสตริงการติดตาม ความคิดใด ๆ
590 c++  gcc  crash  stack-trace  assert 

11
“ การยอมรับใบอนุญาต Xcode / iOS ต้องใช้สิทธิ์ผู้ดูแลระบบโปรดเรียกใช้อีกครั้งในฐานะรูทผ่าน sudo” เมื่อใช้ GCC
ขณะที่พยายามคอมไพล์โปรแกรม C ของฉันให้รันคำสั่งต่อไปนี้: gcc pthread.c -o pthread ผลตอบแทน: การยอมรับใบอนุญาต Xcode / iOS ต้องใช้สิทธิ์ผู้ดูแลระบบโปรดเรียกใช้อีกครั้งในฐานะรูทผ่าน sudo และรหัสของฉันไม่ได้รวบรวม เหตุใดสิ่งนี้จึงเกิดขึ้นและฉันจะแก้ไขปัญหานี้ได้อย่างไร
489 ios  xcode  gcc 

11
ฉันจะแสดงรายการสัญลักษณ์ในไฟล์. so ได้อย่างไร
ฉันจะแสดงรายการสัญลักษณ์ที่ส่งออกจากไฟล์. so ได้อย่างไร ถ้าเป็นไปได้ฉันก็อยากจะรู้แหล่งที่มาของมัน (เช่นถ้าพวกมันถูกดึงเข้ามาจากห้องสมุดคง) ฉันใช้ gcc 4.0.2 ถ้านั่นสร้างความแตกต่าง
486 c++  c  gcc  symbols  name-mangling 


6
เหตุใด GCC จึงสร้างรหัสเร็วขึ้น 15-20% หากฉันปรับขนาดให้เหมาะสมแทนความเร็ว
ฉันสังเกตเห็นครั้งแรกในปี 2009 ว่า GCC (อย่างน้อยในโครงการของฉันและในเครื่องของฉัน) มีแนวโน้มที่จะสร้างรหัสที่เร็วขึ้นอย่างเห็นได้ชัดถ้าฉันปรับขนาด ( -Os) แทนความเร็ว ( -O2หรือ-O3) และฉันสงสัยตั้งแต่นั้นมา ฉันมีการจัดการเพื่อสร้างรหัส (ค่อนข้างโง่) ที่แสดงพฤติกรรมที่น่าแปลกใจนี้และมีขนาดเล็กพอที่จะโพสต์ที่นี่ const int LOOP_BOUND = 200000000; __attribute__((noinline)) static int add(const int& x, const int& y) { return x + y; } __attribute__((noinline)) static int work(int xval, int yval) { int sum(0); for (int i=0; i<LOOP_BOUND; ++i) …

6
ตัวเลือก GCC -fPIC
ฉันได้อ่านเกี่ยวกับ ตัวเลือกของ GCC สำหรับอนุสัญญาการสร้างรหัสแต่ไม่เข้าใจว่า "สร้างรหัสตำแหน่งที่ไม่ขึ้นกับตำแหน่ง (PIC)" อย่างไร โปรดยกตัวอย่างเพื่ออธิบายฉันว่ามันหมายความว่าอย่างไร
437 c++  gcc  options  fpic 

5
Debug vs Release ใน CMake
ในโครงการที่รวบรวม GCC ฉันจะเรียกใช้ CMake สำหรับแต่ละประเภทเป้าหมาย (debug / release) ได้อย่างไร ฉันจะระบุการดีบักและปล่อยแฟล็ก C / C ++ โดยใช้ CMake ได้อย่างไร ฉันจะแสดงให้เห็นได้อย่างไรว่าไฟล์ประมวลผลหลักจะถูกคอมไพล์ด้วยg++และหนึ่งไลบรารีซ้อนกันด้วยgcc?
436 c++  c  gcc  cmake 

23
จะกำจัด `การแปลงที่เลิกใช้งานแล้วจากค่าคงที่สตริงเป็น 'char *' 'คำเตือนใน GCC ได้อย่างไร
ดังนั้นฉันกำลังทำงานกับ codebase ขนาดใหญ่เหลือเกินและเพิ่งอัพเกรดเป็น gcc 4.3 ซึ่งตอนนี้เป็นต้นเหตุของคำเตือนนี้: คำเตือน: การแปลงที่ไม่สนับสนุนจากค่าคงที่สตริงเป็น 'char *' เห็นได้ชัดว่าวิธีที่ถูกต้องในการแก้ไขปัญหานี้คือการค้นหาประกาศทั้งหมดเช่น char *s = "constant string"; หรือฟังก์ชั่นการโทรเช่น: void foo(char *s); foo("constant string"); และทำให้เป็นพconst charอยน์เตอร์ อย่างไรก็ตามนั่นหมายถึงการสัมผัสไฟล์ 564 ขั้นต่ำซึ่งไม่ใช่งานที่ฉันต้องการจะทำในเวลานี้ ปัญหาตอนนี้คือฉันกำลังทำงานด้วย-werrorดังนั้นฉันต้องการวิธีที่จะยับยั้งคำเตือนเหล่านี้ ฉันจะทำสิ่งนั้นได้อย่างไร
409 c++  string  gcc 


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