C++ في كل مكان: كيفية كتابة كود لنظامي Windows و Linux و macOS في آن واحد

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

يوماً ما ستكتب كوداً يعمل في كل مكان

\n

تخيل: أنشأت مشروعاً رائعاً بلغة C++، كل شيء يعمل بشكل مثالي على Windows. يطلب منك صديقك تجميع نسخة لنظام Linux. تتنهد، وتدخل إلى Makefile، وتغير المسارات والمترجمات، وتصطدم بـ #ifdef _WIN32 وبعد ثلاث ساعات تحصل على ملف ثنائي لا يزال يتعطل مع segmentation fault. هل هذا مألوف؟

\n

التطوير عبر المنصات بلغة C++ ليس سحراً، بل مجموعة من المبادئ والأدوات. في هذه المقالة، سنشرح كيفية كتابة كود يعمل على Windows و Linux و macOS دون دموع، مع أمثلة لكود حقيقي وحلول جاهزة. هيا بنا!

\n\n

لماذا C++ مثالية للتطوير عبر المنصات (ولماذا هي مؤلمة)

\n

نقاط قوة C++ - القابلية للترجمة، الأداء، والتحكم في الذاكرة - تجعلها ملك برمجة الأنظمة. لكن هذا يأتي بثمن: كل نظام تشغيل له واجهات برمجة تطبيقات خاصة به، ومترجمات (MSVC, GCC, Clang)، وخصائص نظام ملفات مختلفة.

\n

المشاكل الرئيسية:

\n
    \n
  • ملفات رأس مختلفة — windows.h مقابل unistd.h
  • \n
  • ماكروات مختلفة — _WIN32، __linux__، __APPLE__
  • \n
  • مترجمات مختلفة — MSVC لا يحب إضافات GCC
  • \n
  • مكتبات مختلفة — التحميل الديناميكي (DLL مقابل .so)
  • \n
\n

لكن لا تخف - كل هذه المشاكل قابلة للحل. المهم هو اختيار النهج الصحيح منذ البداية.

\n\n

الأداة رقم 1: CMake - أداة البناء الشاملة الخاصة بك

\n

إذا كنت تكتب تطبيقاً عبر المنصات بلغة C++، فإن أفضل صديق لك هو CMake. إنه ليس نظام بناء مثل Make، بل مولد لملفات البناء: فهو ينشئ Makefile لنظامي Linux/macOS وملف .sln لـ Visual Studio على Windows.

\n

إليك ملف CMakeLists.txt أدنى يعمل في كل مكان:

\n
cmake_minimum_required(VERSION 3.16)\nproject(CrossPlatformApp VERSION 1.0 LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# إضافة ملف تنفيذي\nadd_executable(myapp main.cpp utils.cpp)\n\n# معالجة عبر المنصات\nif(WIN32)\n    target_compile_definitions(myapp PRIVATE PLATFORM_WINDOWS)\n    target_link_libraries(myapp PRIVATE ws2_32)  # مآخذ تحت Windows\nelseif(APPLE)\n    target_compile_definitions(myapp PRIVATE PLATFORM_MACOS)\n    target_link_libraries(myapp PRIVATE "-framework CoreFoundation")\nelse()\n    target_compile_definitions(myapp PRIVATE PLATFORM_LINUX)\nendif()
\n

كما ترى، يسمح لك target_compile_definitions بتعريف ماكروات لكل منصة. في الكود، تستخدمها هكذا:

\n
#ifdef PLATFORM_WINDOWS\n    #include <windows.h>\n    void sleep_ms(int ms) { Sleep(ms); }\n#else\n    #include <unistd.h>\n    void sleep_ms(int ms) { usleep(ms * 1000); }\n#endif
\n

CMake هو المعيار الفعلي. إذا كان مشروعك لا يستخدمه، فقد حان الوقت لتغيير النهج.

\n\n

Boost و Qt: حلول جاهزة للمهام المعقدة

\n

كتابة كل شيء من الصفر هي مهمة الأبطال والمازوخيين. للتطوير عبر المنصات بلغة C++، توجد مكتبات ناضجة تخفي اختلافات أنظمة التشغيل.

\n

Boost - سكين سويسري

\n

Boost.Asio - لبرمجة الشبكات (يعمل على كل من Windows و Linux). Boost.Filesystem - للعمل مع الملفات (سيحل محل std::filesystem إذا كان لديك مترجم قديم). مثال لقراءة دليل عبر المنصات:

\n
#include <boost/filesystem.hpp>\nnamespace fs = boost::filesystem;\n\nvoid list_files(const std::string& path) {\n    for (const auto& entry : fs::directory_iterator(path)) {\n        std::cout << entry.path().string() << std::endl;\n    }\n}
\n

هذا الكود سيتم تجميعه تحت أي نظام تشغيل بدون استخدام #ifdef واحد.

\n\n

Qt - إطار عمل متكامل

\n

إذا كنت بحاجة إلى واجهة مستخدم رسومية، أو عمل مع الشبكة، أو قواعد بيانات، أو تعدد خيوط - فإن Qt هو اختيارك. فهو يوفر واجهة برمجة تطبيقات موحدة لجميع المنصات. مع

المدونات

توصيات الكتب