PDA

View Full Version : روش برنامه نویسی به زبان سی و سی پلاس پلاس در سیستم های لینوکس بیس چگونه است



.:saeed:.
جمعه 20 بهمن 1391, 20:43 عصر
سلام. شاید یکمی سوال عجیب باشه ولی ببینید توی ویندوز شما یه فصل الخطاب :) به نام ویژوال استودیو دارید که تقریبا تمام کارهایی که میخواهید رو توش انجام میدید. ولی توی لینوکس و در واقع برنامه نویسان حرفه ای لینوکس چطور برنامه نویسی میکنن؟ جمله Unix is an IDE ینی چی ؟ ینی شما مثلا توی vim یه کدی رو ادیت میکنید و بعدش همون وقت با اجرا g++ با استفاده از بش کدتون رو کامپایل میکنید ؟ همونطور که گفتم روند ارجح در ویندوز ( که البته خیلی هم شاید روند پیچیده ای نباشه ) استفاده از ویژوال استودیو هستش حد اقل برای من. از مدیریت پروژه ( نگهداری فایل ها و کتابخونه ها و مدیریتشون ) تا خطایابی و دیپلوی اون.
ولی این روند توی لینوکس به چه صورته؟ البته منظورم روند غالبه چون مطمئنا هر کسی برای خودش یه راهی رو میره. روند نوشتن کد ، کامپایل اون ، دیباگینگ اون و مدیریت پروژه اون و... در لینوکس. خوشحال میشم اگه رفرنسی کتابی چیزی هس بهم معرفی کنید.
با تشکر

smemamian
جمعه 20 بهمن 1391, 21:34 عصر
خب شما به راحتی می تونید با eclipse یا Qt یا .. کد بزنی

لینوکس یک هسته هست و بهتره گنو/لینوکس گفته بشه ! گنو/لینوکس هم محیط گرافیکی داره و به راحتی می تونید برنامه نویسی کنید . از توزیع اوبونتو استفاده کنید که نصب و ... بهتری داره .

UfnCod3r
جمعه 20 بهمن 1391, 22:31 عصر
من سوالو خوب نگرفتم !
خب توی لینوکس هم IDE هست نمونش CodeBlock کامپیلر هم هست اینطور نیست که همش با خط فرمان یا شل یا .. کامپایل کنید !
شما توی ویندوز هم می تونید بدون ویژال استدیو تنظیمات پروژه و .. رو هم انجام بدین و بعد با خط فرمان پروژه رو کامپایل کنید !
ولی تو لین از makefile زیاد استفاده می کنن ! مخصوصا برا پروژه های بزرگ و چند سکویی !:متفکر:

.:saeed:.
جمعه 20 بهمن 1391, 22:45 عصر
خب شما به راحتی می تونید با eclipse یا Qt یا .. کد بزنی

لینوکس یک هسته هست و بهتره گنو/لینوکس گفته بشه ! گنو/لینوکس هم محیط گرافیکی داره و به راحتی می تونید برنامه نویسی کنید . از توزیع اوبونتو استفاده کنید که نصب و ... بهتری داره .

ممنون از جوابتون. با Creator و کتابخونه کیوت کار کردم توی ابونتو. ولی خوب میخواستم بدونم فقط سی و سی پلاس پلاس چه وضعی دارن. میدونم توی کریتور میشه سی ++ خالص هم نوشت ولی هدفم چیزای دیگه بود. مث مثلا استفاده از makefile اینا :) . ممنون از جوابتون

حامد مصافی
شنبه 21 بهمن 1391, 00:11 صبح
کامپایل در لینوکس معمولاً همیشه بوسیله make انجام میشه. make یک برنامه برای مدیریت کار با کامپایلر هست. وظیفه make کامپایل کردن فایل های cpp و ساختن فایل‌های o سپس لینک کردن اونها به کتابخانه سیستم‌عامل و در نهایت ساخت خروجی است. اما کار با make پیچیده و گاهاً غیر ممکن است. به همین دلیل نرم‌افزار‌های واسطی برای ساخت اسکریپت make وجود دارند. نمونه‌ای از آنها automake (http://www.gnu.org/software/automake/) هست و برای کانفیگ کردن برای سیستم کاربر هم از autoconf (www.gnu.org/software/autoconf/) استفاده می‌شود. البته کار با این دو نرم‌افزار هم سختی خود را دارد به طوری که بین برنامه‌نویسان به autohells معروف شده‌اند به همین دلیل نرم‌افزار ساده و روان CMake (www.cmake.org) کمی جای این دو نرم‌افزار را تنگ کرده است. یعنی شما در فایل CMakeFiles.txt فقط نام‌ فایل‌های سورس را با سینتکس مشخصی درج می‌کنید و کار کامپایل شما با چند خط دستور صورت می‌گیرد.

البته از IDE هایی که این روند را به صورت خودکار اجرا می‌کنند هم می‌توان استفاده کرد. مانند eclipse, kdevelop و netbeans (که بدون ساخت makefile کار می‌کند)


Unix is an IDE جمله‌ایه که من به شخصه بهش ایمان راسخ دارم! البته منظور فقط unix نیست. بلکه هر سیستم بر پایه اون و البته بسیار بهتر از اون لینوکس که به دلیل کدباز بودن اکثر برنامه‌ها و کتابخانه‌های موجود واقعا میشه گفت یک بهشت برنامه‌نویسیه. شما در IDE های تحت ویندوز فولدر lib و include و ... دارید. در صورتی که در سیستم‌عامل‌هایی مانند لینوکس این فولدر‌ها جزئی از سیستم‌عامل هستند. برای کامپایل از ابزار‌های موجود در IDE استفاده می‌کنید در صورتی که در لینوکس و بقیه از ابزاری که در سطح سیستم‌عامل وجود دارند استفاده می‌شود. بسیاری از کتابخانه‌هایی که در لینوکس نصب می‌کنید بسته اضافی توسعه‌دهندگان دارند که با نصب کردن اونها فایل‌های سرآیند هم به فولدر include اضافه می‌شوند و شما می‌تونید در برنامه خودتان از اون کتابخانه استفاده کنید.

pswin.pooya
شنبه 21 بهمن 1391, 01:23 صبح
کامپایل در لینوکس معمولاً همیشه بوسیله make انجام میشه. make یک برنامه برای مدیریت کار با کامپایلر هست. وظیفه make کامپایل کردن فایل های cpp و ساختن فایل‌های o سپس لینک کردن اونها به کتابخانه سیستم‌عامل و در نهایت ساخت خروجی است. اما کار با make پیچیده و گاهاً غیر ممکن است.

فرایند کامپایل برای پروژه های بزرگ پیچیده هست و سعی می کنند یه اسکریپت بنویسند که فرایند کامپایل رو کنترل کنه یکی از اولین نوع این اسکریپت ها Makefile هستند که با کمک برنامه make فرآیند رو انجام میدن. اما انواع دیگری هم همنطور که اشاره کردید مثل cmake موجوده. من خدوم شخصا عقیده دارم باید از makefile استفاده کرد و بشدت مخالف کار با ide در لینوکس هستم. ideها قابلیتها و انعطاف پذیریهایی رو که دارید از بین می برن.

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



Unix is an IDE جمله‌ایه که من به شخصه بهش ایمان راسخ دارم! البته منظور فقط unix نیست. بلکه هر سیستم بر پایه اون و البته بسیار بهتر از اون لینوکس که به دلیل کدباز بودن اکثر برنامه‌ها و کتابخانه‌های موجود واقعا میشه گفت یک بهشت برنامه‌نویسیه.
من هم به این حرف شما کاملا ایمان دارم واقعا تجربه کار و برنامه نویسی داخل خانواده یونیکس کاملا متفاوت هست و تا تجربش نکنی نمی تونی متوجه بشید که بقیه چه احساسی دارند.


شما در IDE های تحت ویندوز فولدر lib و include و ... دارید. در صورتی که در سیستم‌عامل‌هایی مانند لینوکس این فولدر‌ها جزئی از سیستم‌عامل هستند. برای کامپایل از ابزار‌های موجود در IDE استفاده می‌کنید در صورتی که در لینوکس و بقیه از ابزاری که در سطح سیستم‌عامل وجود دارند استفاده می‌شود. بسیاری از کتابخانه‌هایی که در لینوکس نصب می‌کنید بسته اضافی توسعه‌دهندگان دارند که با نصب کردن اونها فایل‌های سرآیند هم به فولدر include اضافه می‌شوند و شما می‌تونید در برنامه خودتان از اون کتابخانه استفاده کنید.
این مورد و مخصوصا وجود لینک ها ( چه سخت چه نرم ) واقعا برنامه نویسها رو بشدت راحت میکنه. بهتره بگیم از بلاتکلیفی که توی ویندوز وجود داره بیرون میاره. من شخصا هر دفعه که کتابخونه میسازم با هر کامپایل باید یکسری dll ها و libها رو کپی کنم که برای تست سریع بسیار آزار دهنده هست اما توی لینوکس با لینکها کارم چند برابر راحتر میشه.

.:saeed:.
شنبه 21 بهمن 1391, 01:44 صبح
ممنون از جواباتون ولی من هنوز جوابم رو نگرفتم :) . فرض کنید شما میخواهید یه کد خیلی ساده که حاوی چندتایی فایل سورس و فایل هدر هستش رو اولا توی لینوکس ایجاد کنید ، سپس برنامه تون رو توش بنویسید ، بعد میخواهید کامپایلش کنید ، بعدش نیاز دارید دیباگش کنید ، شایدم نیاز باشه یه کتابخونه ای بهش لینک بشه . بگید چیکار میکنید ؟ :) خیلی شد؟!
مثلا مینویسید :
vim main.cpp
بعد کدتون رو توش وارد میکنید بعد میاید بیرون.
vim other.cpp
...
بعد کامپایلش
g++....

و بعدم کارای دیگه.
سوال من اینه که آیا واقعا برنامه نویسان حرفه ای لینوکس به صورت جدا جدا از این ابزار ها استفاده میکنن(فرض کنیم نمیخوان محدود کنن خودشون رو و از یه IDE استفاده کنن )؟ اگه پروژه بزرگ بشه چی ؟ انتقال مکرر بین چند فایل ، انتقال به محل تعریف یه متغیر ، انتقال به محل تعریف یه تابع ، و صدها کاری که با فرکانس زیاد تکرار میشن ، خطایابی کد اینا چی میشه ؟ شاید این کارا برای شما عادی باشه ولی برای من که فقط تجربه ویندوز دارم یکم باورش سخته که آقا من چطور ادعا میکنم

واقعا تجربه کار و برنامه نویسی داخل خانواده یونیکس کاملا متفاوت هست و تا تجربش نکنی نمی تونی متوجه بشید که بقیه چه احساسی دارند.
حال اینکه من چند ابزار جدا از هم میبینم که انتقال بین اونا خودش زمان بره. چه برسه به زمانهایی که جاهای دیگه تلف میشه.
چه امکاناتی از برنامه نویسی در این محیط هستش که ما رو به برنامه نویسی توی این محیط ترغیب کنه.
اصن انتظار ندارم این همه سوال رو جواب بدین :) . رفرنسم بدین ممنون میشم. اگرچه که اگه جواب بدین خیلی خیلی خوشحال میشم.

حامد مصافی
شنبه 21 بهمن 1391, 15:22 عصر
فرایند کامپایل برای پروژه های بزرگ پیچیده هست و سعی می کنند یه اسکریپت بنویسند که فرایند کامپایل رو کنترل کنه یکی از اولین نوع این اسکریپت ها Makefile هستند که با کمک برنامه make فرآیند رو انجام میدن. اما انواع دیگری هم همنطور که اشاره کردید مثل cmake موجوده. من خدوم شخصا عقیده دارم باید از makefile استفاده کرد و بشدت مخالف کار با ide در لینوکس هستم. ideها قابلیتها و انعطاف پذیریهایی رو که دارید از بین می برن.
همونطوری که عرض کردم MakeFile نوشته نمیشه،‌بلکه تولید میشه. CMake هم ابزاری برای تولید MakeFile هست.

حامد مصافی
شنبه 21 بهمن 1391, 15:32 عصر
سوال من اینه که آیا واقعا برنامه نویسان حرفه ای لینوکس به صورت جدا جدا از این ابزار ها استفاده میکنن(فرض کنیم نمیخوان محدود کنن خودشون رو و از یه IDE استفاده کنن )؟ اگه پروژه بزرگ بشه چی ؟ انتقال مکرر بین چند فایل ، انتقال به محل تعریف یه متغیر ، انتقال به محل تعریف یه تابع ، و صدها کاری که با فرکانس زیاد تکرار میشن ، خطایابی کد اینا چی میشه ؟ شاید این کارا برای شما عادی باشه ولی برای من که فقط تجربه ویندوز دارم یکم باورش سخته که آقا من چطور ادعا میکنم

با همه این ابزار‌ها مستقیماً تعامل ندارید.

یک مثال:


یک فولدر برای کد خودتون ایجاد کنید.
یک فایل با نام main.cpp ایجاد کرده و کد‌های خودتون رو در اون بنویسید.
یک فایل با نام CMakeLists.txt ایجاد کرده و کدهای زیر رو در اون کپی کنید.



project(hello_linux)

add_executable(hello_linux main.cpp)

سپس وارد ترمینال شده و دستورات زیر را صادر کنید.

cd /path/to/your/src/dir
mkdir build
cd build
cmake ..
./hello_linux
توضیح دستورات:
خط یکم: ورود به فولدر سورس
خط دوم: ساخت فولدری برای کامپایل
خط سوم:‌ ورود به فولدر فوق
خط چهارم:‌فراخوانی cmake که با فولدر وارد این فولدر (فولدر سورس) کار کند. (از فایل CMakeLists.txt استفاده خواهد کرد.
خط پنجم:‌ اجرای برنامه‌ ساخته شده.

اگر موفق به انجام شدید، خیر مقدم عرض می‌کنم

pswin.pooya
شنبه 21 بهمن 1391, 15:33 عصر
سوال من اینه که آیا واقعا برنامه نویسان حرفه ای لینوکس به صورت جدا جدا از این ابزار ها استفاده میکنن(فرض کنیم نمیخوان محدود کنن خودشون رو و از یه IDE استفاده کنن )؟ اگه پروژه بزرگ بشه چی ؟ انتقال مکرر بین چند فایل ، انتقال به محل تعریف یه متغیر ، انتقال به محل تعریف یه تابع ، و صدها کاری که با فرکانس زیاد تکرار میشن ، خطایابی کد اینا چی میشه ؟ شاید این کارا برای شما عادی باشه ولی برای من که فقط تجربه ویندوز دارم یکم باورش سخته که آقا من چطور ادعا میکنم
گفتم که تا تجربه نکنی متوجه نمی شی. بعضی وقتها بهتره بجای پرسش عملا تست کنی.


حال اینکه من چند ابزار جدا از هم میبینم که انتقال بین اونا خودش زمان بره. چه برسه به زمانهایی که جاهای دیگه تلف میشه.
چه امکاناتی از برنامه نویسی در این محیط هستش که ما رو به برنامه نویسی توی این محیط ترغیب کنه.
یه مثال خیلی ساده :

1. برنامه بنویسید که دو سکتور اول هارد دیسک شما رو برداره و کپی کنه داخل فایل. (اینکار توی لینوکس با یه خط برنامه نویسی حل میشه ).
2. یا برنامه ای بنویسید که از cd-rom شما یک تصویر تهیه کنه. ( یا هر دستگاه دیگه ای )

اما کلا کسی قرار نیست شما رو ترغیب کنه. این میل خودتونه که با لینوکس کد بزنید یا نه. ما فقط میتونیم بگیم که بهتره میخواید قبول کنید یا نه.


حال اینکه من چند ابزار جدا از هم میبینم که انتقال بین اونا خودش زمان بره.
شما اصلا ابزارهای برنامه نویسی لینوکس رو با ویندوز مقایسه نکنید. به مراتب ابزارهای برنامه نویسی لینوکس بهتر و کاملتر هستند. تقریبا هر چیزی که شما برای برنامه نویسی لازم داشته باشید توی لینوکس موجوده. یکی از ابزارهای فوقالعاده gdb هست که دیابگر جدید ویندوز سعی کرده از اون تقلید کنه و نتونسته چندان موفق باشه. یه ابزار دیگه objdump هست که اجازه استخراج تمامی اطلاعات رو از یک فایل آبجکت رو میده و یا objcpy که اجازه هر نوع دستکاری داخل فایل های آبجکت رو فراهم میکنه. یا make که اجازه ایجاد مراحل کامپایل پیچیده رو میده. یا حتی خود gcc که آپشنهای اون چند برابر آپشنهای بقیه کامپایلرها هست.

pswin.pooya
شنبه 21 بهمن 1391, 15:37 عصر
همونطوری که عرض کردم MakeFile نوشته نمیشه،‌بلکه تولید میشه. CMake هم ابزاری برای تولید MakeFile هست.

من خودم makefile رو می نویسم. اینم نمونه اون:
http://arax.svn.sourceforge.net/viewvc/arax/Makefile?revision=24&view=markup