دليل أمر c++ في لينكس: الفروق مع g++ والترجمة العملية

نظرة عامة

يهدف هذا الدليل إلى استكشاف الطبيعة الحقيقية لأمر c++ المتاح في سطر أوامر لينكس وكيفية معالجته لملفات البرمجة داخلياً. سنتعرف على وجه المقارنة الدقيق بينه وبين مترجم g++، مع التطبيق العملي لخطوات بناء الشيفرات البرمجية وتوليد الملفات التنفيذية وتشغيلها في بيئة العمل اليومية.

إعداد بيئة التطوير والتحقق من إصدار أمر c++

نبدأ أولاً بتجهيز النظام بكافة أدوات التطوير وحزم المترجمات الأساسية على توزيعة Ubuntu، وذلك عن طريق تنفيذ الأمر التالي:

تثبيت حزمة build-essential على أوبونتو

apt-get update -qq && apt-get install -y build-essential

ولمعرفة المسار الفعلي الذي يستقر فيه الملف التنفيذي لأداة c++ على النظام، نستعلم عبر الأمر:

which c++

التحقق من مسار المترجم c++

وللكشف عن رقم إصدار المترجم المعتمد حالياً وتفاصيل بناء الحزمة البرمجية، نمرر خيار الفحص التالي:

c++ --version

⚙️ [أهم خيارات وسيطات سطر الأوامر]

-o <file> : تحديد الاسم المرغوب للملف التنفيذي الناتج بدلاً من التسمية التلقائية.
-c : إيقاف العملية عند إنتاج ملف الكائن الوسيط (.o) وتخطي مرحلة الربط النهائي.
-Wall : تمكين التنبيهات الشاملة للمساعدة في كشف المشكلات المنطقية ونقاط الضعف البرمجية.
-O2 : تطبيق تحسينات برمجية ذكية لرفع سرعة المعالجة مع الحفاظ على حجم متوازن للملف.
-std=<standard> : فرض استخدام مواصفة معيارية محددة للغة (على سبيل المثال c++17 أو c++20).
-g : دمج بيانات التنقيح داخل الملف الثنائي لتمكين تتبع الأخطاء البرمجية وفحص المتغيرات عبر المنقح.

التحقق من إصدار مترجم c++

بنية الوصلة الرمزية لـ /usr/bin/c++ وعلاقتها بمترجم g++

يقوم الأمر التالي بسرد الخصائص التفصيلية للملف /usr/bin/c++، مما يوضح ما إذا كان الملف عبارة عن وصلة رمزية (Symbolic Link) ويكشف عن الوجهة التي يشير إليها:

ls -l /usr/bin/c++

فحص الرابط الرمزي لمسار /usr/bin/c++

للتحقق من إدارة هذا الرابط عبر نظام البدائل (update-alternatives) أو فك الارتباط الرمزي وصولاً إلى الملف الثنائي الحقيقي الذي تتم ترجمة الكود عبره، نستخدم السطر المركب التالي:

update-alternatives --display c++ 2>/dev/null || readlink -f /usr/bin/c++

يوفر هذا الإجراء توثيقاً قاطعاً للمترجم الفعلي المسؤول عن معالجة الأوامر عند استدعاء c++ في بيئة العمل.

تتبع الهدف الفعلي لأمر c++ في النظام

إنشاء كود C++ مبدئي وترجمته وتشغيله عبر أمر c++

سنبدأ الخطوة التطبيقية بإنشاء ملف مصدري باسم hello.cpp يحتوي على دالة رئيسية لطباعة نص ترحيبي:

cat << 'EOF' > hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello from Linux c++!" << std::endl;
    return 0;
}
EOF

إنشاء ملف hello.cpp

نقوم بترجمة الملف hello.cpp باستخدام أمر c++ مع تفعيل خيارات التحسين والتنبيه لإنتاج الملف التنفيذي hello:

c++ -Wall -O2 -o hello hello.cpp

اكتمال الأمر بصمت ودون رسائل تحذيرية يشير إلى نجاح خطوة البناء وتوليد الملف الثنائي بالشكل الصحيح.

ترجمة الكود وإنتاج الملف التنفيذي hello

نشغل الآن الملف الناتج مباشرة من المسار الحالي للتحقق من سلامة المخرجات:

./hello

تظهر العبارة "Hello from Linux c++!" بنجاح على واجهة الطرفية مؤكدة سير العملية وفق المتوقع.

تشغيل البرنامج وعرض المخرجات على الطرفية

الترجمة باستخدام أحدث معايير اللغة عبر خيار (-std=c++20)

لاختبار التوافق مع الصيغ الحديثة، سنكتب برنامجاً في ملف modern.cpp يوظف خصائص معيار C++20 مثل std::string_view وتقييم التعبيرات في زمن الترجمة بواسطة constexpr:

cat << 'EOF' > modern.cpp
#include <iostream>
#include <string_view>
int main() {
    constexpr std::string_view msg = "Modern C++20 on Ubuntu";
    std::cout << msg << std::endl;
    return 0;
}
EOF

إنشاء ملف modern.cpp بميزات C++20

نصدر أمر البناء محددين المعيار المطلوب صراحة عبر الخيار -std=c++20 لإنتاج الملف التنفيذي modern:

c++ -std=c++20 -o modern modern.cpp

بمجرد مطابقة الشيفرة لقواعد المعيار، ينتج المترجم التطبيق التنفيذي بسلاسة تامة.

ترجمة الكود وفق معيار C++20 الحديث

نقوم بتشغيل التطبيق النهائي للتأكد من مخرجات المعيار الحديث:

./modern

تظهر الرسالة "Modern C++20 on Ubuntu" بوضوح على الطرفية، مما يثبت جاهزية بيئة الترجمة لدعم أحدث مواصفات C++.

تشغيل الملف التنفيذي modern والتحقق من النتيجة

استعرضنا معاً البنية التحتية لأمر c++ في توزيعات لينكس، والارتباط الوثيق الذي يجمعه بمترجم g++، وتناولنا التطبيق العملي لبناء المشاريع وفق المعايير المعاصرة. تمنحك هذه الخيارات والآليات مرونة عالية لبناء خطوط تطوير وتجميع برمجية فعالة وموثوقة لمشاريعك القادمة.