• کاوش گزینه های gcc. گزینه های بهینه برای x86 GCC گزینه های ردیابی استاندارد در دستورالعمل های تعریف شده است

    عموماً اعتقاد بر این است که GCC از نظر عملکرد از سایر کامپایلرها عقب است. در این مقاله سعی می کنیم بفهمیم که چه بهینه سازی های اساسی کامپایلر GCC باید برای دستیابی به عملکرد قابل قبول اعمال شود.

    گزینه های پیش فرض در GCC چیست؟

    (1) به طور پیش فرض، GCC از سطح بهینه سازی "-O0" استفاده می کند. واضح است که از نظر کارایی مطلوب نیست و برای تدوین محصول نهایی توصیه نمی شود.
    GCC تا زمانی که گزینه "-march=native" ارسال نشود، معماری را که کامپایل روی آن اجرا می شود، تشخیص نمی دهد. به طور پیش فرض، GCC از گزینه تنظیم شده در طول پیکربندی خود استفاده می کند. برای اطلاع از پیکربندی GCC، کافی است:

    این بدان معنی است که GCC "-march=corei7" را به گزینه های شما اضافه می کند (مگر اینکه معماری دیگری مشخص شده باشد).
    اکثر کامپایلرهای GCC برای x86 (پایه برای لینوکس 64 بیتی) به گزینه های داده شده اضافه می کنند: "-mtune=generic -march=x86-64"، زیرا هیچ گزینه ای خاص معماری در پیکربندی داده نشده است. همیشه می توانید با دستور زیر تمام گزینه های تصویب شده هنگام راه اندازی GCC و همچنین گزینه های داخلی آن را پیدا کنید:

    در نتیجه معمولاً استفاده می شود:

    تعیین معماری مورد استفاده برای عملکرد مهم است.تنها استثنا را می توان برنامه هایی در نظر گرفت که فراخوانی توابع کتابخانه تقریباً کل زمان راه اندازی را می گیرد. GLIBC می تواند تابع بهینه را برای یک معماری معین در زمان اجرا انتخاب کند. توجه به این نکته مهم است که وقتی به صورت ایستا پیوند داده می شوند، برخی از توابع GLIBC برای معماری های مختلف نسخه نمی شوند. یعنی اگر سرعت توابع GLIBC مهم باشد مونتاژ پویا بهتر است..
    (2) به طور پیش فرض، اکثر کامپایلرهای GCC برای x86 در حالت 32 بیتی از مدل ممیز شناور x87 استفاده می کنند، زیرا آنها بدون "-mfpmath=sse" پیکربندی شده اند. فقط در صورتی که پیکربندی GCC حاوی "--with-mfpmath=sse" باشد:

    کامپایلر به صورت پیش‌فرض از مدل SSE استفاده می‌کند، در سایر موارد، بهتر است گزینه -mfpmath=sse را در حالت 32 بیتی به بیلد اضافه کنید.
    بنابراین، معمولا استفاده می شود:

    افزودن گزینه ”-mfpmath=sse” در حالت 32 بیتی مهم است! استثنا کامپایلری است که "--with-mfpmath=sse" را در پیکربندی خود دارد.

    حالت 32 بیتی یا 64 بیتی؟

    حالت 32 بیتی معمولاً برای کاهش میزان استفاده از حافظه و در نتیجه سرعت بخشیدن به کار با آن (داده های بیشتری در حافظه پنهان قرار می گیرد) استفاده می شود.
    در حالت 64 بیتی (در مقایسه با 32 بیتی) تعداد رجیسترهای عمومی موجود از 6 به 14 افزایش می یابد، ثبت XMM از 8 به 16. همچنین، تمام معماری های 64 بیتی از پسوند SSE2 پشتیبانی می کنند، بنابراین در حالت 64 بیتی نیازی به گزینه "-mfpmath" =sse را اضافه کنید.
    توصیه می شود از حالت 64 بیتی برای کارهای محاسباتی و حالت 32 بیتی برای برنامه های موبایل استفاده کنید.

    چگونه حداکثر کارایی را بدست آوریم؟

    مجموعه ای از گزینه ها برای به حداکثر رساندن عملکرد وجود ندارد، اما گزینه های زیادی در GCC وجود دارد که ارزش امتحان کردن را دارند. در زیر جدولی با گزینه‌های پیشنهادی و پیش‌بینی رشد پردازنده‌های Intel Atom و نسل دوم اینتل Core i7 نسبت به گزینه «-O2» آورده شده است. پیش‌بینی‌ها بر اساس میانگین هندسی نتایج مجموعه خاصی از وظایف است که توسط GCC نسخه 4.7 گردآوری شده است. همچنین فرض می‌کند که پیکربندی کامپایلر برای x86-64 عمومی انجام شده است.
    پیش بینی افزایش عملکرد در برنامه های تلفن همراه نسبت به "-O2" (فقط در حالت 32 بیتی، زیرا اصلی ترین مورد برای بخش تلفن همراه است):

    پیش بینی افزایش عملکرد در وظایف محاسباتی نسبت به "-O2" (در حالت 64 بیتی):
    -m64 -Ofast -flto ~17%
    -m64 -Ofast -flto -march=بومی ~21%
    -m64 -Ofast -flto -march=native -funroll-loops ~22%

    مزیت حالت 64 بیتی نسبت به 32 بیت برای کارهای محاسباتی با گزینه های "-O2 -mfpmath=sse" حدود 5٪ است.
    تمام داده های مقاله پیش بینی بر اساس نتایج مجموعه معینی از معیارها است.
    در زیر توضیحاتی در مورد گزینه های استفاده شده در مقاله آورده شده است. توضیحات کامل (به زبان انگلیسی): http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html"
    • "-Ofast" مانند "-O3 -fast-math" سطح بالاتری از بهینه‌سازی و بهینه‌سازی‌های تهاجمی‌تر را برای محاسبات حسابی (مانند ارتباط مجدد واقعی) ممکن می‌سازد.
    • بهینه سازی های متقابل ماژول "-flto".
    • حالت 32 بیتی "-m32".
    • "-mfpmath=sse" رجیسترهای XMM را قادر می سازد در محاسبات واقعی (به جای پشته واقعی در حالت x87) استفاده شوند.
    • "-funroll-loops" باز کردن حلقه را فعال می کند

    برای استفاده صحیح از gcc، کامپایلر استاندارد C برای لینوکس، باید گزینه های خط فرمان را یاد بگیرید. علاوه بر این، gcc زبان C را گسترش می دهد. حتی اگر قصد دارید کد منبع خود را در استاندارد ANSI آن زبان بنویسید، برخی از پسوندهای gcc وجود دارد که برای درک فایل های هدر لینوکس باید آنها را بدانید.

    اکثر گزینه های خط فرمان همان گزینه هایی هستند که توسط کامپایلرهای C استفاده می شود. هیچ استانداردی برای برخی از گزینه ها وجود ندارد. در این فصل به مهم ترین گزینه هایی که در برنامه نویسی روزمره استفاده می شوند اشاره خواهیم کرد.

    تلاش برای انطباق با استاندارد ISO C مفید است، اما از آنجایی که C یک زبان سطح پایین است، شرایطی وجود دارد که ویژگی های استاندارد به اندازه کافی رسا نیستند. دو حوزه وجود دارد که از برنامه های افزودنی gcc به طور گسترده استفاده می شود: تعامل با کد اسمبلی (این موضوعات در http://www.delorie.com/djgpp/doc/brennan/ پوشش داده شده است) و ساخت کتابخانه های مشترک (به فصل 8 مراجعه کنید). از آنجایی که فایل‌های هدر بخشی از کتابخانه‌های مشترک هستند، برخی پسوندها نیز در فایل‌های هدر سیستم ظاهر می‌شوند.

    البته، افزونه های بسیار بیشتری وجود دارند که در هر نوع برنامه نویسی دیگری مفید هستند که واقعاً می توانند به کدنویسی کمک کنند. اطلاعات بیشتر در مورد این برنامه‌های افزودنی را می‌توانید در مستندات gcc Texinfo بیابید.

    5.1. گزینه های gcc

    gcc گزینه های دستوری زیادی را می پذیرد. خوشبختانه مجموعه گزینه هایی که واقعاً باید از آنها آگاه باشید چندان بزرگ نیستند و در این فصل به بررسی آن خواهیم پرداخت.

    بیشتر گزینه‌ها مشابه یا مشابه گزینه‌های سایر کامپایلرها هستند، gcc شامل اسناد عظیمی از گزینه‌های آن است که از طریق info gcc در دسترس است (صفحه gcc man نیز این اطلاعات را ارائه می‌دهد، اما صفحات man به اندازه اسناد Texinfo به‌روزرسانی نمی‌شوند. ).

    -o نام فایل نام فایل خروجی را مشخص می کند. اگر در حال کامپایل کردن در یک فایل شی هستید، معمولاً این کار ضروری نیست، یعنی پیش‌فرض جایگزینی filename.c با filename.o است. با این حال، اگر یک فایل اجرایی ایجاد کنید، به طور پیش فرض (به دلایل تاریخی) با نام a.out ایجاد می شود. این همچنین زمانی مفید است که می خواهید فایل خروجی را در دایرکتوری دیگری قرار دهید.
    -با بدون پیوند دادن فایل منبع مشخص شده در خط فرمان، کامپایل می کند. در نتیجه، یک فایل شی برای هر فایل منبع ایجاد می شود. هنگام استفاده از make، کامپایلر gcc معمولا برای هر فایل شیء فراخوانی می شود. به این ترتیب، در صورت بروز خطا، پیدا کردن فایلی که کامپایل نشده است آسان تر است. با این حال، اگر دستورات را با دست تایپ می کنید، غیر معمول نیست که چندین فایل در یک تماس gcc مشخص شوند. اگر ممکن است هنگام تعیین چندین فایل در خط فرمان ابهامی ایجاد شود، بهتر است فقط یک فایل را مشخص کنید. به عنوان مثال، به جای gcc -c -o a.o a.c b.c، منطقی است که از gcc -c -o a.o b.c استفاده کنید.
    -دفو ماکروهای پیش پردازنده را در خط فرمان تعریف می کند. ممکن است لازم باشد نویسه هایی را که پوسته به عنوان کاراکترهای خاص در نظر می گیرد، کنار بگذارید. برای مثال، هنگام تعریف رشته، باید از استفاده از کاراکترهای پایان‌دهنده رشته خودداری کنید. دو روش متداول عبارتند از: -Dfoo="bar"" و -Dfoo=\"bar\". راه اول بسیار بهتر عمل می‌کند اگر فضاهایی در رشته وجود دارد، زیرا پوسته با فضای سفید به روش خاصی برخورد می کند.
    من دایرکتوری دایرکتوری را به فهرست دایرکتوری ها برای جستجوی فایل های شامل اضافه می کند.
    فهرست -L دایرکتوری را به فهرست دایرکتوری ها برای جستجوی کتابخانه ها اضافه می کند، gcc کتابخانه های مشترک را بر کتابخانه های ایستا ترجیح می دهد مگر اینکه خلاف آن مشخص شده باشد.
    -من فک میکنم پیوندها علیه کتابخانه lib foo. مگر اینکه طور دیگری مشخص شده باشد، gcc پیوند در برابر کتابخانه های مشترک (lib foo .so) را به کتابخانه های ثابت (lib foo .a) ترجیح می دهد. پیوند دهنده توابع را در تمام کتابخانه های فهرست شده به ترتیب فهرست شده جستجو می کند. جستجو وقتی تمام می شود که تمام عملکردهای مورد نیاز پیدا شوند.
    -استاتیک پیوندها فقط با کتابخانه های ثابت. فصل 8 را ببینید.
    -g، -ggdb شامل اطلاعات اشکال زدایی است. گزینه -g باعث می‌شود gcc اطلاعات استاندارد اشکال‌زدایی را در بر بگیرد. گزینه -ggdb به شما می گوید که حجم عظیمی از اطلاعات را درج کنید که فقط اشکال زدای gdb می تواند آنها را بفهمد.
    اگر فضای دیسک محدود است یا می‌خواهید برخی از عملکردها را فدای سرعت پیوند کنید، باید از -g استفاده کنید. در این مورد، ممکن است لازم باشد از یک دیباگر غیر از gdb استفاده کنید. برای کامل‌ترین اشکال‌زدایی، باید -ggdb را مشخص کنید. در این صورت، gcc تا حد امکان اطلاعات بیشتری را برای gdb آماده می‌کند. لازم به ذکر است که برخلاف اکثر کامپایلرها، gcc برخی از اطلاعات اشکال زدایی را در کد بهینه شده قرار می دهد. با این حال، ردیابی در اشکال‌زدای کدهای بهینه‌سازی شده می‌تواند مشکل باشد، زیرا زمان اجرا می‌تواند بخش‌هایی از کد را که انتظار دارید اجرا شود پرش کرده و رد شود. با این حال، می توانید ایده خوبی در مورد اینکه چگونه کامپایلرهای بهینه سازی نحوه اجرای کد را تغییر می دهند، به دست آورید.
    -O، -روشن باعث می شود gcc کد را بهینه کند. به طور پیش فرض، gcc مقدار کمی بهینه سازی را انجام می دهد. هنگام تعیین یک عدد (n)، بهینه سازی در یک سطح مشخص انجام می شود. رایج ترین سطح بهینه سازی 2 است. در حال حاضر بالاترین سطح بهینه سازی در نسخه استاندارد gcc 3 است. توصیه می کنیم از -O2 یا -O3 استفاده کنید. -O3 می تواند اندازه برنامه را افزایش دهد، بنابراین اگر مهم است هر دو را امتحان کنید. اگر حافظه و فضای دیسک برای برنامه شما مهم است، می‌توانید از گزینه -Os نیز استفاده کنید، که اندازه کد را به قیمت افزایش زمان اجرا به حداقل می‌رساند. gcc تنها زمانی که حداقل بهینه سازی (-O) اعمال شده باشد، داخلی ها را فعال می کند.
    -ansi پشتیبانی در برنامه های C از تمام استانداردهای ANSI (X3.159-1989) یا معادل ISO آنها (ISO/IEC 9899:1990) (که معمولاً به عنوان C89 یا کمتر C90 نامیده می شود). توجه داشته باشید که این امر مطابقت کامل با استاندارد ANSI/ISO را فراهم نمی کند.
    گزینه -ansi پسوندهای gcc را که معمولاً با استانداردهای ANSI/ISO در تضاد هستند غیرفعال می کند. (با توجه به این واقعیت که این پسوندها توسط بسیاری از کامپایلرهای C دیگر پشتیبانی می شوند، این در عمل مشکلی ایجاد نمی کند.) همچنین ماکرو __STRICT_ANSI__ را تعریف می کند (همانطور که در ادامه این کتاب توضیح داده شد) که فایل های هدر برای پشتیبانی از ANSI/ISO مطابق با آن استفاده می کنند. محیط.
    -آدم ملانطقی تمام اخطارها و خطاهای مورد نیاز استاندارد زبان ANSI/ISO C را نمایش می دهد. این امر مطابقت کامل با استاندارد ANSI/ISO را ارائه نمی دهد.
    -دیوار تولید همه هشدارهای gcc را فعال می کند، که معمولا مفید است. اما این شامل گزینه هایی نمی شود که ممکن است در موارد خاص مفید باشند. سطح مشابهی از جزئیات برای تجزیه کننده پرز برای کد منبع شما تنظیم می شود، gcc به شما اجازه می دهد تا به صورت دستی هر هشدار کامپایلر را روشن و خاموش کنید. دفترچه راهنمای gcc تمام هشدارها را با جزئیات شرح می دهد.
    5.2. فایل های هدر
    5.2.1. طولانی طولانی

    نوع long long نشان می دهد که طول بلوک حافظه حداقل به اندازه طول است. در اینتل i86 و دیگر پلتفرم‌های 32 بیتی، طول 32 بیت است، در حالی که طولانی 64 بیت است. در پلتفرم‌های 64 بیتی، اشاره‌گرها و طولانی‌ها 64 بیت طول می‌کشند، و طول می‌تواند بسته به پلتفرم، 32 یا 64 بیت باشد. نوع طولانی در استاندارد C99 (ISO/IEC 9899:1999) پشتیبانی می‌شود و یک پسوند C طولانی مدت است که توسط gcc ارائه شده است.

    5.2.2. توابع داخلی

    برخی از بخش‌های فایل‌های هدر لینوکس (به ویژه آنهایی که مختص یک سیستم خاص هستند) از توابع داخلی بسیار گسترده استفاده می‌کنند. آنها به سرعت ماکروها هستند (هزینه ای برای فراخوانی تابع ندارند) و انواع اعتبار سنجی را که در یک فراخوانی تابع معمولی موجود است را ارائه می دهند. کدی که توابع داخلی را فراخوانی می کند باید با حداقل حداقل بهینه سازی (-O) فعال کامپایل شود.

    5.2.3. کلمات کلیدی توسعه یافته جایگزین

    در gcc، هر کلمه کلیدی توسعه‌یافته (کلمات کلیدی که توسط استاندارد ANSI/ISO تعریف نشده‌اند) دو نسخه دارد: خود کلمه کلیدی و کلمه کلیدی که از دو طرف با دو زیرخط احاطه شده است. هنگامی که کامپایلر در حالت استاندارد استفاده می شود (معمولاً هنگامی که گزینه -ansi فعال است)، کلمات کلیدی توسعه یافته عادی شناسایی نمی شوند. بنابراین، برای مثال، کلمه کلیدی ویژگی در یک فایل هدر باید به صورت __خصیصه__ نوشته شود.

    5.2.4. ویژگی های

    کلمه کلیدی مشخصه توسعه یافته برای ارسال اطلاعات بیشتر در مورد یک تابع، متغیر یا نوع اعلام شده به gcc از آنچه توسط کد ANSI/ISO C مجاز است استفاده می شود. برای مثال، ویژگی aligned به gcc می گوید که دقیقا چگونه یک متغیر یا نوع را تراز کند. ویژگی packed نشان می دهد که هیچ بالشتکی استفاده نخواهد شد. noreturn مشخص می کند که این تابع هرگز برنمی گردد، که به gcc اجازه می دهد بهتر بهینه شود و از هشدارهای جعلی جلوگیری کند.

    ویژگی های تابع با اضافه کردن آنها به اعلان تابع، به عنوان مثال:

    void die_die_die(int، char*) __ویژگی__ ((__noreturn__));

    یک اعلان ویژگی بین پرانتز و یک نقطه ویرگول قرار می گیرد و حاوی کلمه کلیدی ویژگی و به دنبال آن ویژگی های داخل پرانتز است. اگر ویژگی های زیادی وجود دارد، باید از یک لیست جدا شده با کاما استفاده شود.

    printm(char*, ...)

    ویژگی__((const,

    قالب (printf, 1, 2)))؛

    در این مثال، می بینید که printm هیچ مقداری غیر از مقادیر مشخص شده را در نظر نمی گیرد و هیچ عارضه جانبی مربوط به تولید کد (const) ندارد، printm نشان می دهد که gcc باید آرگومان های تابع را به همان روش printf() بررسی کند. استدلال ها آرگومان اول رشته قالب است و آرگومان دوم اولین پارامتر جایگزین (فرمت) است.

    برخی از ویژگی ها با پیشرفت مواد مورد بحث قرار خواهند گرفت (به عنوان مثال، در طی توضیح ساخت کتابخانه های مشترک در فصل 8). اطلاعات جامع در مورد ویژگی ها را می توان در اسناد gcc در قالب Texinfo یافت.

    گاهی اوقات ممکن است متوجه شوید که در حال جستجوی فایل های هدر لینوکس هستید. به احتمال زیاد تعدادی طرح را خواهید یافت که مطابق با ANSI/ISO نیستند. برخی از آنها ارزش بررسی را دارند. تمام ساختارهای پوشش داده شده در این کتاب با جزئیات بیشتری در مستندات gcc پوشش داده شده است.

    گاهی اوقات ممکن است متوجه شوید که در حال جستجوی فایل های هدر لینوکس هستید. به احتمال زیاد تعدادی طرح را خواهید یافت که مطابق با ANSI/ISO نیستند. برخی از آنها ارزش بررسی را دارند. تمام ساختارهای پوشش داده شده در این کتاب با جزئیات بیشتری در مستندات gcc پوشش داده شده است.

    اکنون که کمی در مورد استاندارد C آموخته اید، بیایید نگاهی به گزینه هایی بیندازیم که کامپایلر gcc ارائه می دهد تا اطمینان حاصل شود که با استاندارد C زبانی که در آن می نویسید مطابقت دارد. سه راه برای اطمینان از سازگاری کد C شما با استانداردها و عاری از نقص وجود دارد: گزینه‌هایی که کنترل می‌کنند کدام نسخه استاندارد را می‌خواهید مطابقت داشته باشید، تعاریفی که فایل‌های هدر را کنترل می‌کنند، و گزینه‌های هشداری که باعث بررسی دقیق‌تر کد می‌شوند.

    gcc دارای مجموعه عظیمی از گزینه ها است و در اینجا فقط مواردی را که مهمترین آنها را در نظر می گیریم پوشش می دهیم. فهرست کاملی از گزینه‌ها را می‌توانید در صفحات مرد آنلاین gcc پیدا کنید. همچنین به طور مختصر درباره برخی از گزینه های #define Directive که می توان از آنها استفاده کرد صحبت خواهیم کرد. آنها معمولاً باید قبل از هر خط #include در کد منبع شما مشخص شوند یا در خط فرمان gcc تعریف شوند. ممکن است از فراوانی گزینه ها برای انتخاب استاندارد به جای یک پرچم ساده برای اجبار به استفاده از استاندارد فعلی شگفت زده شوید. دلیل آن این است که بسیاری از برنامه های قدیمی بر رفتار کامپایلر تاریخی متکی هستند و برای به روز رسانی آنها به آخرین استانداردها به کار قابل توجهی نیاز دارند. به ندرت، اگر هرگز، بخواهید کامپایلر خود را به روز کنید تا کدهای در حال اجرا را خراب کند. با تغییر استانداردها، مهم است که بتوانیم بر خلاف یک استاندارد خاص کار کنیم، حتی اگر جدیدترین نسخه استاندارد نباشد.

    حتی اگر یک برنامه کوچک برای استفاده شخصی می‌نویسید، جایی که رعایت استانداردها ممکن است چندان مهم نباشد، اغلب منطقی است که هشدارهای gcc اضافی را اضافه کنید تا کامپایلر را مجبور کنید قبل از اجرای برنامه به دنبال خطا در کد شما بگردد. این همیشه کارآمدتر از عبور از کد در دیباگر و تعجب کردن از کجاست. کامپایلر گزینه های زیادی دارد که فراتر از بررسی استانداردهای ساده است، مانند توانایی تشخیص کدی که با استاندارد مطابقت دارد اما احتمالاً معنایی مشکوک دارد. به عنوان مثال، یک برنامه ممکن است یک دستور اجرا داشته باشد که اجازه می دهد تا یک متغیر قبل از مقداردهی اولیه به آن دسترسی پیدا کند.

    اگر نیاز به نوشتن برنامه ای برای استفاده مشترک دارید، با توجه به درجه انطباق و انواع هشدارهای کامپایلر که فکر می کنید کافی هستند، بسیار مهم است که کمی تلاش کنید و کد خود را بدون هیچ هشداری کامپایل کنید. اگر برخی هشدارها را بپذیرید و عادت کنید که آنها را نادیده بگیرید، یک روز ممکن است هشدار جدی تری ظاهر شود که خطر از دست دادن آن را دارید. اگر کد شما همیشه بدون پیام‌های هشدار کامپایل می‌شود، هشدار جدیدی به‌طور قطع مورد توجه شما قرار می‌گیرد. کامپایل کردن کد بدون اخطار عادت خوبی است.

    گزینه های کامپایلر برای استانداردهای ردیابی

    Ansi مهمترین گزینه در مورد استانداردها است و باعث می شود کامپایلر مطابق استاندارد زبان ISO C90 عمل کند. برخی از برنامه های افزودنی gcc غیر منطبق با استاندارد را غیرفعال می کند، نظرات به سبک C++ (//) را در برنامه های C غیرفعال می کند، و مدیریت سه گراف های ANSI (توالی های سه نویسه) را فعال می کند. علاوه بر این، حاوی ماکرو __STRICT_ANSI__ است که برخی از پسوندها را در فایل‌های هدر غیرفعال می‌کند که با استاندارد سازگار نیستند. در نسخه های بعدی کامپایلر، استاندارد پذیرفته شده ممکن است تغییر کند.

    Std= - این گزینه با ارائه پارامتری که دقیقاً مشخص می کند چه استانداردی مورد نیاز است، کنترل دقیق تری بر روی اینکه کدام استاندارد باید استفاده شود را فراهم می کند. گزینه های اصلی موجود زیر هستند:

    C89 - پشتیبانی از استاندارد C89؛

    Iso9899:1999 - پشتیبانی از آخرین نسخه استاندارد ISO، C90.

    Gnu89 - از استاندارد C89 پشتیبانی می کند اما برخی از برنامه های افزودنی گنو و برخی عملکردهای C99 را مجاز می کند. در نسخه 4.2 gcc این گزینه پیش فرض است.

    گزینه‌هایی برای استاندارد ردیابی در دستورالعمل‌ها

    ثابت هایی وجود دارند (#defines) که می توانند به عنوان گزینه هایی در خط فرمان یا به عنوان تعاریف در کد منبع برنامه مشخص شوند. ما به طور کلی فکر می کنیم که آنها از خط فرمان کامپایلر استفاده می کنند.

    STRICT_ANSI__ استاندارد ISO C را مجبور به استفاده می کند. زمانی که گزینه -ansi در خط فرمان کامپایلر داده می شود، تعریف می شود.

    POSIX_C_SOURCE=2 - عملکرد تعریف شده توسط IEEE Std 1003.1 و 1003.2 را فعال می کند. بعداً در این فصل به این استانداردها باز خواهیم گشت.

    BSD_SOURCE - عملکرد سیستم های BSD را فعال می کند. اگر با تعاریف POSIX مغایرت داشته باشند، تعاریف BSD اولویت دارند.

    GNU_SOURCE - به طیف گسترده ای از ویژگی ها و توابع، از جمله پسوندهای گنو اجازه می دهد. اگر این تعاریف با تعاریف POSIX مغایرت داشته باشند، تعاریف دوم اولویت دارند.

    گزینه های کامپایلر برای خروجی هشدارها

    این گزینه ها از خط فرمان به کامپایلر ارسال می شوند. باز هم، ما فقط موارد اصلی را فهرست می کنیم، یک لیست کامل را می توان در راهنمای راهنمای آنلاین gcc یافت.

    Pedantic قدرتمندترین گزینه پاکسازی برای کد C است. علاوه بر فعال کردن گزینه بررسی در برابر استاندارد C، برخی از ساختارهای سنتی C را که توسط استاندارد ممنوع هستند غیرفعال می‌کند و همه پسوندهای گنو را غیرقانونی از استاندارد می‌کند. از این گزینه باید استفاده شود تا کد C شما تا حد امکان قابل حمل باشد. عیب آن این است که کامپایلر به تمیزی کد شما بسیار اهمیت می دهد و گاهی اوقات شما مجبور می شوید مغز خود را برای خلاص شدن از شر چند اخطار باقیمانده در نظر بگیرید.

    Wformat - صحت انواع آرگومان های توابع خانواده printf را بررسی می کند.

    Wparentheses - وجود پرانتز را حتی در جاهایی که نیازی به آنها نیست بررسی می کند. این گزینه برای بررسی اینکه آیا ساختارهای پیچیده همانطور که در نظر گرفته شده مقداردهی اولیه شده اند بسیار مفید است.

    wswitch-default - وجود نوع پیش‌فرض را در دستورات سوئیچ بررسی می‌کند، که به طور کلی سبک برنامه‌نویسی خوبی در نظر گرفته می‌شود.

    Wunused - موارد مختلف را بررسی می کند، مانند توابع استاتیک اعلام شده اما اعلام نشده، پارامترهای استفاده نشده، نتایج دور ریخته شده.

    دیوار - اکثر انواع هشدار gcc را فعال می کند، از جمله تمام گزینه های قبلی -W (فقط -pdantic پوشش داده نمی شود). با کمک آن به راحتی می توان به پاکی کد برنامه دست یافت.

    توجه داشته باشید

    گزینه های هشدار پیشرفته بسیار بیشتری وجود دارد، برای همه جزئیات به صفحات وب gcc مراجعه کنید. به طور کلی، توصیه می کنیم از -Wall استفاده کنید. این یک سازش خوب بین بررسی برای اطمینان از کیفیت بالای کد و خروجی کامپایلر هشدارهای بی اهمیت زیادی است که به سختی می توان آنها را باطل کرد.

    GSSیک کامپایلر بهینه سازی رایگان برای زبان های C، C++ است.

    برنامه gcc، که از خط فرمان راه اندازی می شود، یک افزونه برای گروهی از کامپایلرها است. بسته به پسوند نام فایل ارسال شده به عنوان پارامتر و گزینه های اضافی، gccپیش پردازشگرها، کامپایلرها، لینک کننده های لازم را اجرا می کند.

    فایل های با پسوند سی سییا .Cمانند فایل های C++، فایل هایی با پسوند رفتار می شوند جبه عنوان برنامه هایی به زبان C و فایل هایی با پسوند .oبه عنوان اشیا در نظر گرفته می شود.

    برای کامپایل کد منبع C++ موجود در یک فایل F.cc، و یک فایل شی ایجاد کنید F.o.، باید دستور را اجرا کنید:

    Gcc -c F.cc

    گزینه -c به معنای "فقط کامپایل" است.

    برای پیوند دادن یک یا چند فایل شی مشتق شده از کد منبع - F1.o, F2.o، ... - در یک فایل اجرایی واحد اف، باید دستور را وارد کنید:

    Gcc -o F F1.o F2.o

    گزینه -o نام فایل اجرایی را مشخص می کند.

    ترکیب دو مرحله پردازش - کامپایل و پیوند - در یک مرحله مشترک با استفاده از دستور امکان پذیر است:

    Gcc -o F F1.cc ... -lg++

    - امکان ترکیب اضافی و گزینه های پیوند. گزینه –lg++ نیاز به گنجاندن کتابخانه استاندارد C++ را نشان می دهد. - امکان کتابخانه های اضافی
    پس از پیوند، یک فایل اجرایی F ایجاد می شود که با دستور قابل اجرا است

    ./F

    - لیستی از آرگومان های خط فرمان برای برنامه شما.
    کتابخانه ها اغلب در فرآیند پیوند استفاده می شوند. کتابخانه مجموعه ای از فایل های شی است که در یک فایل واحد گروه بندی شده و فهرست بندی شده اند. هنگامی که فرمان link کتابخانه ای را در لیست فایل های شی برای پیوند پیدا می کند، بررسی می کند که آیا فایل های شی از قبل پیوند داده شده حاوی فراخوانی هایی با توابع تعریف شده در یکی از فایل های کتابخانه هستند یا خیر. اگر چنین توابعی یافت شوند، فراخوانی های مربوطه به کد فایل شی از کتابخانه پیوند داده می شوند. کتابخانه ها را می توان با گزینه -lname گنجاند. در این صورت در دایرکتوری های استاندارد مانند /lib، /usr/lib، /usr/local/libکتابخانه را در فایل نامگذاری شده جستجو می کند libname.a. کتابخانه‌ها باید پس از فایل‌های منبع یا شی که حاوی فراخوانی‌های توابع مربوطه هستند، فهرست شوند.

    گزینه های تالیف

    در میان بسیاری از گزینه های کامپایل و پیوند، موارد زیر بیشترین استفاده را دارند:

    گزینه هدف
    این گزینه به این معنی است که فقط کامپایل مورد نیاز است. از فایل های منبع برنامه، فایل های شی به شکل ایجاد می شود نام.o. پیوند انجام نمی شود.
    -Dname=value نام نام را در برنامه کامپایل شده به عنوان مقدار v تعریف کنید آلو. اثر همان داشتن رشته است #define name valueدر ابتدای برنامه قسمت = ارزشممکن است حذف شود، در این صورت مقدار پیش فرض 1 است.
    -o نام فایل استفاده کنید نام فایلبه عنوان نام فایل تولید شده
    -lname هنگام پیوند از libname.so استفاده کنید
    -Llib- مسیر
    -Iinclude-path
    lib-path و include-path را به ترتیب به کتابخانه های استاندارد و دایرکتوری های جستجوی هدر اضافه کنید.
    -g اطلاعات اشکال زدایی را در شی یا فایل اجرایی دیباگر قرار دهید gdb. گزینه باید هم برای کامپایل و هم برای پیوند مشخص شود. در ترکیب -gتوصیه می شود از گزینه غیرفعال کردن بهینه سازی استفاده کنید -O0(پایین را ببینید)
    -MM وابستگی ها به فایل های هدر مورد استفاده در یک برنامه C یا C++ را در قالبی مناسب برای ابزار چاپ کنید ساختن. هیچ شی یا فایل اجرایی ایجاد نمی شود.
    -صفحه دستورالعمل های نمایه سازی را در یک شی یا فایل اجرایی برای تولید اطلاعات مورد استفاده توسط ابزار قرار دهید gprof. گزینه باید هم برای کامپایل و هم برای پیوند مشخص شود. مونتاژ شده با آپشن -صفحهاین برنامه یک فایل آماری هنگام راه اندازی تولید می کند. برنامه gprofبر اساس این فایل، یک رونوشت تولید می کند که زمان صرف شده برای اجرای هر تابع را نشان می دهد.
    -دیوار پیام های مربوط به هشدارها یا خطاهایی را که در حین کامپایل کردن برنامه رخ می دهد چاپ کنید.
    -O1
    -O2
    -O3
    سطوح مختلف بهینه سازی
    -O0 بهینه سازی نکنید اگر از چندگانه استفاده می کنید -Oگزینه های با یا بدون اعداد سطح، آخرین گزینه معتبر است.
    -من برای افزودن دایرکتوری های خود برای جستجوی فایل های هدر در فرآیند ساخت استفاده می شود
    به پیوند دهنده منتقل شد. برای افزودن دایرکتوری های خود برای جستجوی کتابخانه ها در طول فرآیند ساخت استفاده می شود.
    -l به پیوند دهنده منتقل شد. برای افزودن کتابخانه های خود برای جستجو در طول فرآیند ساخت استفاده می شود.