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

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

5
__attribute __ ของ gcc เป็น (บรรจุแล้ว) / #pragma ไม่ปลอดภัยหรือไม่
ใน C คอมไพเลอร์จะวางโครงสมาชิกของโครงสร้างตามลำดับที่ประกาศโดยมีการเติมไบต์ที่เป็นไปได้แทรกระหว่างสมาชิกหรือหลังสมาชิกรายสุดท้ายเพื่อให้แน่ใจว่าสมาชิกแต่ละคนได้รับการจัดตำแหน่งอย่างถูกต้อง gcc จัดเตรียมส่วนขยายของภาษา__attribute__((packed))ซึ่งบอกคอมไพเลอร์ว่าไม่ให้แทรกการซ้อนทำให้สมาชิกโครงสร้างไม่ถูกต้อง ตัวอย่างเช่นถ้าระบบต้องการintวัตถุทั้งหมดที่มีการจัดตำแหน่งแบบ 4 ไบต์__attribute__((packed))สามารถทำให้intสมาชิก struct ได้รับการจัดสรรที่ออฟเซ็ตแปลก ๆ การอ้างอิงเอกสาร gcc: แอตทริบิวต์ `ที่บรรจุ 'ระบุว่าเขตข้อมูลตัวแปรหรือโครงสร้างควรมีการจัดตำแหน่งที่เล็กที่สุดที่เป็นไปได้ - หนึ่งไบต์สำหรับตัวแปรและหนึ่งบิตสำหรับเขตข้อมูลเว้นแต่ว่าคุณจะระบุค่าที่มากขึ้นด้วยแอตทริบิวต์` จัดชิด' เห็นได้ชัดว่าการใช้ส่วนขยายนี้อาจส่งผลให้ข้อกำหนดด้านข้อมูลมีขนาดเล็กลง แต่มีโค้ดที่ช้ากว่าเนื่องจากคอมไพเลอร์จะต้องสร้างรหัสเพื่อเข้าถึงสมาชิกไบต์ที่ไม่ถูกต้องในแต่ละครั้ง แต่มีกรณีใดบ้างที่สิ่งนี้ไม่ปลอดภัยหรือไม่? คอมไพเลอร์สร้างรหัสที่ถูกต้อง (แม้ว่าช้ากว่า) เสมอเพื่อเข้าถึงสมาชิกที่มีโครงสร้างไม่ตรงตามที่กำหนดหรือไม่? เป็นไปได้ไหมที่จะทำเช่นนั้นในทุกกรณี?
164 c  gcc  pragma-pack 

5
ทำไมลูปนี้สร้าง“ คำเตือน: การวนซ้ำ 3u เรียกใช้พฤติกรรมที่ไม่ได้กำหนด” และส่งออกมากกว่า 4 บรรทัด
รวบรวมสิ่งนี้: #include <iostream> int main() { for (int i = 0; i < 4; ++i) std::cout << i*1000000000 << std::endl; } และgccสร้างคำเตือนต่อไปนี้: warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations] std::cout << i*1000000000 << std::endl; ^ ฉันเข้าใจว่ามีจำนวนเต็มล้นที่ลงนามแล้ว สิ่งที่ฉันไม่สามารถทำได้คือทำไม iค่าจึงแตกโดยการดำเนินการมากเกินไป ฉันได้อ่านคำตอบว่าทำไมจำนวนเต็มล้นใน x86 กับ GCC ทำให้เกิดการวนซ้ำไม่สิ้นสุด? แต่ฉันยังไม่ชัดเจนว่าทำไมสิ่งนี้เกิดขึ้น - ฉันได้รับ "undefined" หมายถึง "อะไรก็ได้ที่เกิดขึ้น" แต่สาเหตุพื้นฐานของพฤติกรรมที่เฉพาะเจาะจงนี้คืออะไร …

1
สร้างไฟล์. so จากไฟล์. c โดยใช้บรรทัดคำสั่ง gcc
ฉันกำลังพยายามสร้างโปรเจค Hello world สำหรับลินุกซ์ไดนามิกไลบรารี (ไฟล์. so) ดังนั้นฉันมีไฟล์ hello.c: #include <stdio.h> void hello() { printf("Hello world!\n"); } ฉันจะสร้างไฟล์. so ที่ส่งออกhello()โดยใช้ gcc จากบรรทัดคำสั่งได้อย่างไร
162 c  linux  gcc  shared-libraries 

14
ไม่สามารถรวบรวมโปรแกรม C บน Mac หลังจากอัปเกรดเป็น Mojave
ฉันใช้คำสั่ง gcc บนเทอร์มินัลเพื่อรวบรวมโปรแกรม C แต่ในทันทีหลังจากการอัปเดตเป็นระบบปฏิบัติการ Mac ของฉัน (เป็น macOS 10.14 Mojave และ XCode 10.0) ฉันเริ่มได้รับข้อความ: test.c:8:10: fatal error: stdio.h: No such file or directory #include <stdio.h> ^~~~~~~~~ compilation terminated. ฉันติดตั้ง gcc ไว้แล้วและหาได้ใน/usr/local/binนั้นมี gcc อยู่ในนั้นจริงๆ ฉันพยายามเรียกใช้ไฟล์เดียวกันบน iMac อื่นของฉันและทำงานได้โดยไม่มีปัญหา ฉันพยายามเรียกใช้xcode-select --installและติดตั้งแล้วดังนั้นจึงไม่สามารถแก้ไขปัญหาที่ฉันมีอยู่ในขณะนี้ ฉันคาดเดาว่าเส้นทางจะมีความยุ่งเหยิงเนื่องจากไม่สามารถหาได้gccหลังจากที่ฉันเริ่มคัดลอกและวางคำสั่งบางอย่างจากแหล่งข้อมูลอื่นเพื่อแก้ไขปัญหานี้ ต้องการความช่วยเหลือในเรื่องนี้
159 c  macos  gcc  terminal 

3
LD_LIBRARY_PATH เทียบกับ LIBRARY_PATH
ฉันกำลังสร้างโปรแกรม C ++ แบบง่ายและฉันต้องการแทนที่ระบบที่ให้ไลบรารี่ที่ใช้ร่วมกันกับเวอร์ชันที่ใหม่กว่าชั่วคราวสำหรับการพัฒนาและการทดสอบ ฉันพยายามตั้งค่าตัวแปร LD_LIBRARY_PATH แต่ตัวเชื่อมโยง (ld) ล้มเหลวด้วย: / usr / bin / ld: ไม่สามารถหา -lyaml-cpp ฉันคาดว่าจะทำงานได้เพราะตามหน้า man ld: ตัวลิงก์ใช้พา ธ การค้นหาต่อไปนี้เพื่อค้นหาไลบรารีแบบแบ่งใช้ที่จำเป็น: ... สำหรับตัวเชื่อมโยงแบบดั้งเดิมเนื้อหาของตัวแปรสภาพแวดล้อม "LD_LIBRARY_PATH" ... ฉันลองตั้ง LIBRARY_PATH แล้วก็ใช้งานได้ ตามคู่มือ GCC: ค่าของ LIBRARY_PATH เป็นรายการไดเร็กทอรีที่คั่นด้วยโคลอนเหมือนกับ PATH เมื่อกำหนดค่าเป็นคอมไพเลอร์เนทีฟ GCC จะพยายามไดเรกทอรีที่ระบุไว้เมื่อค้นหาไฟล์ลิงเกอร์พิเศษหากไม่สามารถค้นหาได้โดยใช้ GCC_EXEC_PREFIX การลิงก์โดยใช้ GCC ยังใช้ไดเรกทอรีเหล่านี้เมื่อค้นหาไลบรารีสามัญสำหรับตัวเลือก -l (แต่ไดเรกทอรีที่ระบุด้วย -L ​​จะมาก่อน) ตามที่แนะนำ (GCC) แนะนำ …
159 gcc  g++  ld 

3
การประกาศฟังก์ชั่นไม่ใช่ต้นแบบ
ฉันมีห้องสมุดที่ฉันสร้าง mylib.c: #include <mylib.h> int testlib() { printf("Hello world\n"); return (0); } mylib.h: #include <stdio.h> extern int testlib(); ในโปรแกรมของฉันฉันพยายามเรียกใช้ฟังก์ชันไลบรารีนี้: myprogram.c: #include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); } เมื่อฉันพยายามรวบรวมโปรแกรมนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: ในไฟล์รวมจาก myprogram.c: 1 mylib.h: คำเตือน 2: การประกาศฟังก์ชั่นไม่ใช่ต้นแบบ ฉันกำลังใช้: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2) คำถามของฉันคือวิธีที่เหมาะสมในการประกาศต้นแบบฟังก์ชั่นคืออะไร?
158 c  gcc 

9
เหตุใดการไหลออกจากจุดสิ้นสุดของฟังก์ชันที่ไม่ใช่โมฆะโดยไม่ส่งคืนค่าไม่ทำให้เกิดข้อผิดพลาดของคอมไพเลอร์
นับตั้งแต่ฉันรู้มาหลายปีแล้วว่าสิ่งนี้ไม่ได้สร้างข้อผิดพลาดตามค่าเริ่มต้น (อย่างน้อยใน GCC) ฉันสงสัยอยู่เสมอว่าเพราะอะไร ฉันเข้าใจว่าคุณสามารถออกธงคอมไพเลอร์เพื่อสร้างคำเตือน แต่มันควรจะเป็นข้อผิดพลาดหรือไม่? ทำไมมันจึงสมเหตุสมผลสำหรับฟังก์ชั่นที่ไม่ใช่โมฆะไม่คืนค่าที่ถูกต้อง? ตัวอย่างตามที่ร้องขอในความคิดเห็น: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ... คอมไพล์
158 c++  c  gcc  g++ 

24
ธง GCC ที่มีประโยชน์สำหรับ C
นอกเหนือจากการตั้งค่า-Wallและการตั้งค่า-std=XXXแล้วมีประโยชน์อื่น ๆ อีกมากมาย แต่มีการรวบรวมค่าสถานะคอมไพเลอร์น้อยกว่าที่ใช้ใน C? ฉันสนใจเป็นพิเศษในการเตือนเพิ่มเติมและ / หรือการเปลี่ยนคำเตือนเป็นข้อผิดพลาดในบางกรณีเพื่อลดความไม่ตรงกันของประเภทอุบัติเหตุใด ๆ
157 c  gcc  compiler-flags 


3
คุณจะใช้ gcc เพื่อสร้างรหัสการประกอบในไวยากรณ์ของ Intel ได้อย่างไร
gcc -Sตัวเลือกที่จะสร้างรหัสการชุมนุมใน AT & T ไวยากรณ์จะมีวิธีในการสร้างไฟล์ในไวยากรณ์อินเทล? หรือมีวิธีการแปลงระหว่างทั้งสอง?
151 gcc  x86  gnu  intel  assembly 

5
เหตุใดเครื่องมือเพิ่มประสิทธิภาพ GCC 6 ที่ปรับปรุงแล้วจึงใช้งาน C ++ ได้จริง
GCC 6 มีคุณลักษณะเครื่องมือเพิ่มประสิทธิภาพใหม่ : จะถือว่าthisไม่เป็นโมฆะและปรับให้เหมาะสมตามนั้น ตอนนี้การแพร่กระจายช่วงค่าถือว่าตัวชี้ของฟังก์ชันสมาชิก C ++ นี้ไม่ใช่ค่าว่าง กำจัดนี้ null ร่วมกันตรวจสอบตัวชี้แต่ยังแบ่งบางส่วนไม่สอดคล้องรหัสฐาน (เช่น Qt-5, โครเมี่ยม, KDevelop) สามารถใช้การแก้ไขชั่วคราว -fno-delete-null-pointer-checks ชั่วคราวได้ รหัสที่ไม่ถูกต้องสามารถระบุได้โดยใช้ -fsanitize = undefined เอกสารการเปลี่ยนแปลงเรียกสิ่งนี้ว่าเป็นอันตรายอย่างชัดเจนเพราะแบ่งรหัสที่ใช้บ่อยเป็นจำนวนมากอย่างน่าประหลาดใจ เหตุใดสมมติฐานใหม่นี้จึงไม่ใช้งานรหัส C ++ ที่ใช้งานได้จริง มีรูปแบบเฉพาะหรือไม่ที่โปรแกรมเมอร์ไม่ประมาทหรือไม่มีข้อมูลจะพึ่งพาพฤติกรรมที่ไม่ได้กำหนดนี้หรือไม่? ฉันไม่สามารถจินตนาการได้ว่ามีใครเขียนif (this == NULL)เพราะมันแปลกประหลาดมาก

7
ทำการติดตั้ง แต่ไม่ใช่ไปยังไดเรกทอรีเริ่มต้นหรือไม่
ฉันต้องการเรียกใช้ 'ทำการติดตั้ง' ดังนั้นฉันจึงมีทุกอย่างที่ฉันต้องการ แต่ฉันต้องการให้มันติดตั้งสิ่งต่าง ๆ ในโฟลเดอร์ของตัวเองซึ่งตรงข้ามกับระบบ / usr / bin ฯลฯ เป็นไปได้ไหม แม้ว่ามันจะอ้างอิงถึงเครื่องมือใน / usr / bin เป็นต้น?
148 linux  gcc  makefile  autotools 

2
คณิตศาสตร์ที่รวดเร็วของ gcc ทำอะไรได้จริง?
ฉันเข้าใจว่าการ--ffast-mathตั้งค่าสถานะของ gcc สามารถเพิ่มความเร็วได้อย่างมากสำหรับ ops แบบลอยตัวและออกไปนอกมาตรฐาน IEEE แต่ฉันไม่สามารถหาข้อมูลเกี่ยวกับสิ่งที่เกิดขึ้นจริงได้เมื่อเปิดใช้งาน ใครช่วยกรุณาอธิบายรายละเอียดบางอย่างและอาจให้ตัวอย่างที่ชัดเจนว่าจะมีการเปลี่ยนแปลงอย่างไรถ้าธงเปิดหรือปิด? ฉันพยายามขุดผ่าน SO สำหรับคำถามที่คล้ายกัน แต่ไม่สามารถหาอะไรอธิบายการทำงานของคณิตศาสตร์ได้อย่างรวดเร็ว

6
ข้อได้เปรียบของ __builtin_expect ของ GCC คืออะไรถ้ามีข้อความอื่น?
ฉันมาข้ามในที่ที่พวกเขาใช้#define__builtin_expect เอกสารกล่าวว่า: ฟังก์ชั่นในตัว: long __builtin_expect (long exp, long c) คุณอาจใช้__builtin_expectเพื่อให้ข้อมูลการทำนายสาขา โดยทั่วไปคุณควรใช้ความคิดเห็นโปรไฟล์จริงสำหรับสิ่งนี้ ( -fprofile-arcs) เนื่องจากโปรแกรมเมอร์ไม่ดีพอที่จะทำนายว่าโปรแกรมของพวกเขาทำงานได้จริงอย่างไร อย่างไรก็ตามมีแอพพลิเคชั่นที่รวบรวมข้อมูลนี้ยาก ค่าส่งคืนคือค่าของexpซึ่งควรเป็นนิพจน์ที่สำคัญ exp == cความหมายของในตัวที่ว่ามันเป็นที่คาดว่า ตัวอย่างเช่น: if (__builtin_expect (x, 0)) foo (); จะระบุว่าเราไม่ได้คาดหวังว่าจะโทรfooเพราะเราคาดว่าxจะเป็นศูนย์ ดังนั้นทำไมไม่ใช้โดยตรง: if (x) foo (); แทนไวยากรณ์ที่ซับซ้อนด้วย__builtin_expect?
144 c  linux  gcc  built-in 

3
จะรวบรวมไลบรารีแบบคงที่ใน Linux ได้อย่างไร?
ฉันมีคำถาม: วิธีการรวบรวมไลบรารีแบบคงที่ใน Linux ด้วยgccคือฉันต้องคอมไพล์ซอร์สโค้ดของฉันลงในไฟล์ชื่อ out.a. การคอมไพล์ด้วยคำสั่งนั้นเพียงพอgcc -o out.a out.cหรือไม่? ฉันไม่ค่อยคุ้นเคยgccหวังว่าใครจะช่วยฉันได้
141 c  gcc  static-libraries 

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