انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید




نویسنده موضوع: اینکلود کردن فایل .h در vscode  (دفعات بازدید: 2064 بار)

0 کاربر و 9 مهمان درحال مشاهده موضوع.

آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
اینکلود کردن فایل .h در vscode
« : 02 اسفند 1399، 08:15 ق‌ظ »
توی محیط vscode با زبان C توی تابع main از توابعی که توی یه فایل دیگه هست استفاده کنم.(کتابخونه های شخصی)
ابتدای برنامه هدر فایل رو include کردم اما موقع اجرا کردن اون قسمت هایی که از توابع یک فایل دیگه استفاده شده خطا میده و میگه نمیشناستشون
سیستم عامل اوبونتو (لینوکس) هست.

main.c:(.text+0x2af): undefined reference to `func1'
/usr/bin/ld: main.c:(.text+0x2e0): undefined reference to `func2'

وقتی تنها از خود فایل main.c استفاده میکنم مشکلی نداره و برنامه درست اجرا میشه.

توی یکسری از آموزش هایی که دیدم نوشته بود که باید آدرس فایل هایی که قصد اضافه کردن داریم رو توی فلان قسمت اضافه کنید چون آموزش برای ویندوز بود از چیزی شبیه به

c://user/...
استفاده شده بود اما برای اوبونتو بجای c:// بنده به چیزی شبیه به /munt/434636245762562... رسیدم اما این اضافه کردن آدرس هم جواب نداد.

در کل حسابی گیج شدم
دلیل استفاده از vs Code قابلیت هایی که داره و پوشش زیادی هست که برای اکثر زبان ها داره

لطفا راهنماییم کنید







{^-^}

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5125
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #1 : 02 اسفند 1399، 10:19 ق‌ظ »
برای استفاده از کتابخونه‌های شخصی نباید از <> توی include کردنشون استفاده کرد. به‌جاش از "" یا '' استفاده کنید.
برای استفاده از اونها هم باید مسیر کامل رو توی include کردن، مشخص کرد. مثلا اگه یه کتابخونه شخصی به اسم mylib.h توی مسیر /home/username/project/mylib.hدارم‌، برای استفاده توی c، اینجوری include می‌کنم
#include "/home/username/project/mylib.h"پسوند فایل حتما باید h. باشه.

راه دیگه اینه‌ که تمام کتابخونه‌ها و فایل اصلی یه جا باشند که اینجوری لازم نیست مسیر مطلق بدید، کافیه که اسم فایل رو فقط بدید (توی "").
میدونید که زکات علم نشر آن است

آفلاین sd70

  • Jr. Member
  • *
  • ارسال: 95
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #2 : 02 اسفند 1399، 03:42 ب‌ظ »
با توجه به متن خطا مشکلی در اینکلود شدن فایل هدرتون وجود نداره چون در غیر این صورت موقع کامپایل خطایی شبیه به این نمایش داده میشد:
main.c:1:10: fatal error: your_lib.h: No such file or directory

این ارور، ارور لینکر هستش و معنیش اینه که فقط فایل main.c به تنهایی کامپایل شده و بهمین دلیل در مرحله لینک شدن این مشکل پیش اومده. با فرض اینکه از gcc استفاده میکنید انگار چنین دستوری اجرا شده باشه:
gcc main.c -o output
در صورتی که باید اون فایل c که شامل تعریف (definition) توابع تون هست هم کامپایل بشه؛ یعنی به این صورت:
gcc main.c your_lib.c -o output
در این زمینه با vscode کار نکردم و آشنایی ندارم اما یه سرچ کلی کردم به نظر میاد در یک سری فایل json که مربوط به پروژه میشه باید اسم فایلهای c درج شده باشه که احتمالا پلاگینی برای انجام خودکار این کار وجود داره. پیشنهاد میکنم عبارت multi-file c/c++ project vscode رو سرچ کنید.
« آخرین ویرایش: 02 اسفند 1399، 03:49 ب‌ظ توسط sd70 »

آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #3 : 02 اسفند 1399، 05:13 ب‌ظ »
برای استفاده از کتابخونه‌های شخصی نباید از <> توی include کردنشون استفاده کرد. به‌جاش از "" یا '' استفاده کنید.
برای استفاده از اونها هم باید مسیر کامل رو توی include کردن، مشخص کرد. مثلا اگه یه کتابخونه شخصی به اسم mylib.h توی مسیر /home/username/project/mylib.hدارم‌، برای استفاده توی c، اینجوری include می‌کنم
#include "/home/username/project/mylib.h"پسوند فایل حتما باید h. باشه.

راه دیگه اینه‌ که تمام کتابخونه‌ها و فایل اصلی یه جا باشند که اینجوری لازم نیست مسیر مطلق بدید، کافیه که اسم فایل رو فقط بدید (توی "").

متشکرم استاد
تمام این موارد رعایت شده
اما برای اینکلود کردن توی محیط vsCode اینگار باید تنظیماتی توی بخش setting انجام بشه تا فراخوانی بدرستی صورت بگیره و تا الان تنها توی محیط vscode موفق نشدم اما توی محیط های دیگه مثل iar, Code::Blocks, eclipse, stm32CubeIDE, keil, visual studio و ... مشکلی نداشتم.

واقعا هنگ کردم البته میدونم صرفا بدلیل بی تجربگی بنده توی استفاده از این نرم افزار هست که ان شاء الله با کمک دوستان یادش میگیرم
{^-^}

آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #4 : 02 اسفند 1399، 05:16 ب‌ظ »
با توجه به متن خطا مشکلی در اینکلود شدن فایل هدرتون وجود نداره چون در غیر این صورت موقع کامپایل خطایی شبیه به این نمایش داده میشد:
main.c:1:10: fatal error: your_lib.h: No such file or directory

این ارور، ارور لینکر هستش و معنیش اینه که فقط فایل main.c به تنهایی کامپایل شده و بهمین دلیل در مرحله لینک شدن این مشکل پیش اومده. با فرض اینکه از gcc استفاده میکنید انگار چنین دستوری اجرا شده باشه:
gcc main.c -o output
در صورتی که باید اون فایل c که شامل تعریف (definition) توابع تون هست هم کامپایل بشه؛ یعنی به این صورت:
gcc main.c your_lib.c -o output
در این زمینه با vscode کار نکردم و آشنایی ندارم اما یه سرچ کلی کردم به نظر میاد در یک سری فایل json که مربوط به پروژه میشه باید اسم فایلهای c درج شده باشه که احتمالا پلاگینی برای انجام خودکار این کار وجود داره. پیشنهاد میکنم عبارت multi-file c/c++ project vscode رو سرچ کنید.

ممنون استاد

اتفاقا به همین تنظیمات json برخورد کرم اما چون رشتم برنامه نویسی نبوده اطلاعات ضعیفی در اینخصوص دارم و همون اضافه کردن آدرسی که توی کامنت اول گفتم رو توی یکی از همین فایل های json اضافه کردم اما نتیجه نگرفتم.

ممنون بابت معرفی کلمات لازم جهت سرچ کردن حتما انجامش میدم ببینم چی میشه
{^-^}

آفلاین sd70

  • Jr. Member
  • *
  • ارسال: 95
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #5 : 02 اسفند 1399، 07:27 ب‌ظ »
خواهش میکنم. ببینید vscode یک IDE نیست هر چند که ابزارها و پلاگین‌های خوبی داره که میشه تا حدی اون رو شبیه به یک IDE کرد.
در رابطه با برنامه نویسی c اگه برنامه‌ای که قراره بنویسید یک برنامه سادس و از نظر تعداد فایل‌ها و حجم پروژه پیچیدگی نداره میتونید تمام فایلها رو کنار هم قرار بدید و تو همون ترمینال خود vscode مستقیما دستور کامپایل رو اجرا کنید که ساده ترین شکلش به این صورته:
gcc main.c file1.c file2.c -o your_output
اگر هم پروژه تون ساده نیست طبیعتا استفاده از این روش خیلی ممکنه کارایی نداشته باشه و بهتره از ابزارهایی که vscode در اختیار تون میذاره استفاده کنید (فکر میکنم پلاگین های مناسبی رو برای این کار داشته باشه)

روش‌های دیگری هم نظیر make، استفاده از IDE و ... وجود داره اما همون vscode یا اجرای مستقیم gcc (در صورتی که پروژه تون کوچیکه ) فکر میکنم مناسب باشه
« آخرین ویرایش: 02 اسفند 1399، 07:30 ب‌ظ توسط sd70 »

آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #6 : 03 اسفند 1399، 12:40 ق‌ظ »
خواهش میکنم. ببینید vscode یک IDE نیست هر چند که ابزارها و پلاگین‌های خوبی داره که میشه تا حدی اون رو شبیه به یک IDE کرد.
در رابطه با برنامه نویسی c اگه برنامه‌ای که قراره بنویسید یک برنامه سادس و از نظر تعداد فایل‌ها و حجم پروژه پیچیدگی نداره میتونید تمام فایلها رو کنار هم قرار بدید و تو همون ترمینال خود vscode مستقیما دستور کامپایل رو اجرا کنید که ساده ترین شکلش به این صورته:
gcc main.c file1.c file2.c -o your_output
اگر هم پروژه تون ساده نیست طبیعتا استفاده از این روش خیلی ممکنه کارایی نداشته باشه و بهتره از ابزارهایی که vscode در اختیار تون میذاره استفاده کنید (فکر میکنم پلاگین های مناسبی رو برای این کار داشته باشه)

روش‌های دیگری هم نظیر make، استفاده از IDE و ... وجود داره اما همون vscode یا اجرای مستقیم gcc (در صورتی که پروژه تون کوچیکه ) فکر میکنم مناسب باشه

با سرچی که پیشنهاد دادین تا حدی پیش رفتم اما باز نتیجه ای نگرفتم

پلاگین های زبان c رو روی vscode نصب کردم.

پروژه هایی که جهت تست به زبان c میارم روی vscode کمی شلوغ هستن برای همین کدی که گفتین:
gcc main.c file1.c file2.c -o your_output
استفاده ازش مشکل سازه.(البته برای تست نحوه اینکلود کردن تنها از ۱ فایل .h و .c استفاده میکنم تا کار ساده تر باشه)

من با ساختن و تعریف کردن فایل های make و json به نتیجه نرسیدم(البته ۹۹ درصد فکر میکنم توی تعریفات این فایل ها خطاهایی دارم که خودم نمیدونم چون تابحال با این شیوه کار نکرده بودم.)

در حال حاضر موقع زدن دکمه Run برنامه تنها فایل main.c رو کامپایل و اجرا میکنه اما با دستور
gcc main.c file1.c file2.c -o your_outputهمه فایلها کامپایل میشن و آدرس فایل ها شناسایی میشه!!!

puts("please Help me!!!")
{^-^}

آفلاین sd70

  • Jr. Member
  • *
  • ارسال: 95
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #7 : 03 اسفند 1399، 01:05 ق‌ظ »
اگه فایل های c دقیقا کنار فایل main تون قرار داره بعنوان یک روش موقت (بدون استفاده از ابزارهایی نظیر make یا پلاگین‌های vscode) میتونین دستور رو به این صورت استفاده کنید تا نیازی نباشه اسم تک تک فایلها بصورت مجزا تایپ بشه:
gcc *.c -o your_output

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1253
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #8 : 03 اسفند 1399، 10:31 ق‌ظ »
شاید بهتر باشه که پوشه پروژه را فشرده و ارسال کنید.


آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #9 : 03 اسفند 1399، 02:12 ب‌ظ »
اگه فایل های c دقیقا کنار فایل main تون قرار داره بعنوان یک روش موقت (بدون استفاده از ابزارهایی نظیر make یا پلاگین‌های vscode) میتونین دستور رو به این صورت استفاده کنید تا نیازی نباشه اسم تک تک فایلها بصورت مجزا تایپ بشه:
gcc *.c -o your_output

متشکرم بابت راهنمایی های شما
ان شاء الله مشکل رو حل کنم جوابش رو میزارم تا بقیه مثل من گیر نکنن

اما هنوز کارم راه نیفتاده (البته فعلا جهت راه افتادن کار دارم از eclipse c/c++  استفاده میکنم ولی بخاطر قابلیت های vsCode میخوام یادش بگیرم)
{^-^}

آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #10 : 03 اسفند 1399، 02:13 ب‌ظ »
شاید بهتر باشه که پوشه پروژه را فشرده و ارسال کنید.

لینک پوشه:
https://s16.picofile.com/file/8425770434/vsCodeWs.zip.html

اگر دستور :
//testFunc1();رو از کامنت در بیارید مشکلات نشون داده میشه و اگر کامنت کنید برنامه درست اجرا میشه.
برنامه توی main و برنامه توی تابع testFunc1() یکی هستن.
برنامه main اجرا میشه اما برنامه تابع اجرا نمیشه
« آخرین ویرایش: 03 اسفند 1399، 02:16 ب‌ظ توسط kook65247 »
{^-^}

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1253
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #11 : 03 اسفند 1399، 08:38 ب‌ظ »
برنامه مشکلی ندارد.

در پوشه پروژه دستور زیر را اجرا کنید.

کامپایل
gcc *.c -o barnameاجرا
$ ./barname
//---side1
test in main is OK...
8.000000
8.000000
//---side2
test include external lib is OK...
8.000000
8.000000

این‌که test.c اجرا نمی‌شود درست است و نباید هم اجرا شود چون ()main ندارد.




هر برنامهٔ نوشته شده به زبان C یک تابع منحصربفرد به نام ()main دارد که اجرای برنامه را شروع می‌کند.

برنامه‌ها در فایل‌هایی با پسوند c. به نام source نوشته می‌شوند در این نمونه دو source دارید
main.c
test.c

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

برنامه C برای تبدیل شدن به فایل اجرایی نیاز به کامپایل دارد.
به طور خلاصه و نادقیق در فرایند تبدیل فایل c. به برنامه اجرایی دو مرحله اصلی داریم
۱. تولید کد میانی object code
۲. پیوند زدن قسمت‌ها به هم link 

بسته gcc شامل تمام ابزارهای لازم برای این‌کار هست.
apt install gcc
gcc می‌تواند این مراحل را با هم ترکیب کند و اغلب نیازی به اجرای گام به گام ندارید.

دستور زیر را در نظر داشته باشید.
gcc main.c test.c -o barname
دو فایل main.c و test.c را کامپایل کردیم و در خروجی یک فایل اجرایی با نام barname ساخته شده است که با barname/. می‌توانیم آن را اجرا کنیم.

در واقع اینجا gcc مرحله تولید object code و پیوند زدن را با هم انجام داده است.

شما به همین نیاز خواهید داشت.

یک تغییرات مختصری هم در فایل‌ها دادم. پیوست اول را ببینید.



برای این‌که مجبور نباشید هر بار مرحله کامپایل را دستی تکرار کنید می‌توانید از build systemها استفاده کنید برای نمونه make.

در پروژه‌های بزرگتر فایل‌ها را در پوشه‌های جداگانه قرار می‌دهند.

برای این مثال چینش فایل‌ها به این شکل انجام دادم

$ tree
.
├── headers
│   └── test.h
├── Makefile
└── src
    ├── main.c
    └── test.c

با افزودن makefile از این پس برای کامپایل و ساخت فایل اجرایی کافی است تنها دستور make را اجرا کنید.

پیوست دوم، پروژه به همراه استفاده از make است.

پس از اجرای دستور make پوشه‌ای به نام bin حاوی فایل اجرایی ساخته خواهد شد.
اجرا
bin/barname
مرتبط


ابتدا روند کار را بیاموزید سپس به تنظیمات محیط توسعه با توجه به نیازها بپردازید.

« آخرین ویرایش: 03 اسفند 1399، 08:44 ب‌ظ توسط esmaeelE »

آفلاین kook65247

  • Full Member
  • *
  • ارسال: 167
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #12 : 04 اسفند 1399، 12:28 ق‌ظ »
برنامه مشکلی ندارد.

در پوشه پروژه دستور زیر را اجرا کنید.

کامپایل
gcc *.c -o barnameاجرا
$ ./barname
//---side1
test in main is OK...
8.000000
8.000000
//---side2
test include external lib is OK...
8.000000
8.000000

این‌که test.c اجرا نمی‌شود درست است و نباید هم اجرا شود چون ()main ندارد.




هر برنامهٔ نوشته شده به زبان C یک تابع منحصربفرد به نام ()main دارد که اجرای برنامه را شروع می‌کند.

برنامه‌ها در فایل‌هایی با پسوند c. به نام source نوشته می‌شوند در این نمونه دو source دارید
main.c
test.c

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

برنامه C برای تبدیل شدن به فایل اجرایی نیاز به کامپایل دارد.
به طور خلاصه و نادقیق در فرایند تبدیل فایل c. به برنامه اجرایی دو مرحله اصلی داریم
۱. تولید کد میانی object code
۲. پیوند زدن قسمت‌ها به هم link 

بسته gcc شامل تمام ابزارهای لازم برای این‌کار هست.
apt install gcc
gcc می‌تواند این مراحل را با هم ترکیب کند و اغلب نیازی به اجرای گام به گام ندارید.

دستور زیر را در نظر داشته باشید.
gcc main.c test.c -o barname
دو فایل main.c و test.c را کامپایل کردیم و در خروجی یک فایل اجرایی با نام barname ساخته شده است که با barname/. می‌توانیم آن را اجرا کنیم.

در واقع اینجا gcc مرحله تولید object code و پیوند زدن را با هم انجام داده است.

شما به همین نیاز خواهید داشت.

یک تغییرات مختصری هم در فایل‌ها دادم. پیوست اول را ببینید.



برای این‌که مجبور نباشید هر بار مرحله کامپایل را دستی تکرار کنید می‌توانید از build systemها استفاده کنید برای نمونه make.

در پروژه‌های بزرگتر فایل‌ها را در پوشه‌های جداگانه قرار می‌دهند.

برای این مثال چینش فایل‌ها به این شکل انجام دادم

$ tree
.
├── headers
│   └── test.h
├── Makefile
└── src
    ├── main.c
    └── test.c

با افزودن makefile از این پس برای کامپایل و ساخت فایل اجرایی کافی است تنها دستور make را اجرا کنید.

پیوست دوم، پروژه به همراه استفاده از make است.

پس از اجرای دستور make پوشه‌ای به نام bin حاوی فایل اجرایی ساخته خواهد شد.
اجرا
bin/barname
مرتبط


ابتدا روند کار را بیاموزید سپس به تنظیمات محیط توسعه با توجه به نیازها بپردازید.
نمودونم چندبار خوندم تا کامل متجه بشم چی به چیه!!!
هر دو روش رو تست کردم و جواب داد
بسیار متشکرم عالی و خیلی نکته داشت

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

برای vsCode راهی هست که مثل نرم افزارهایی همچون visual studio , codeBlocks, keil, iar, bascom, codevision, eclipse و... پروژه رو نوشت و تمام عملیات لینک کردن و غیره رو خود vscode انجام بده؟

چون الان با شیوه ای که شما بیان کردید برنامه بدرستی راه میفته اما برای دیباگ کردن همون خطاهای سابق سرجاش مونده و نمیتونم از قابلیت دیباگ کردن برای برنامه ای که از کتابخونه های دستی استفاده میکنه ، استفاده کنم.(اما دیباگ کردنش برای برنامه ای که تنها از یک فایل حاوی main استفاده میکنه مشکلی نداره و کار میکنه.)
{^-^}

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1253
  • جنسیت : پسر
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #13 : 04 اسفند 1399، 01:43 ق‌ظ »
برای آشنایی بیشتر با make همین لینک‌ها مناسب هستند.
کم کم شروع کنید و هر نمونه را یاد بگیرید.
مرتبط

فکر نمی‌کنم نیازی به کتاب داشته باشید برای پروژه‌هایی که انجام می‌دهید فهمیدن همین مقدار کافی است.



در مورد تنظیمات vscode باید فایل task.json را طوری تنظیم کنید که از make استفاده کند.

برای شروع اینجا را ببینید و پروژه‌ای را گفته گام به گام بسازید.


vscode نرم‌افزار آزاد نیست می‌توانید به جای آن از vscodium استفاده کنید.


ویرایش

مقاله فارسی زیر هم برای آشنایی با make خوب است
نویسنده:‌ آیدین غریب نواز

« آخرین ویرایش: 06 اسفند 1399، 01:22 ق‌ظ توسط esmaeelE »

آفلاین moheb2000

  • Sr. Member
  • *
  • ارسال: 297
  • جنسیت : پسر
  • Hello, World
    • mebrahimi.ir
پاسخ : اینکلود کردن فایل .h در vscode
« پاسخ #14 : 05 اسفند 1399، 09:26 ق‌ظ »
من نمیدونم چرا اصرار دارید از vs code استفاده کنید ولی codeblocks هم امکانات فوق العاده بیشتر و قوی تری برای برنامه نویسی C داره و هم خیلی از این مشکلاتی که اینجا بهش خوردید رو بهش برنمیخورید. تنظیمات کامپایلر و لینکر و کامپایل کردن و خیلی از بخش های دیگش رو راحت میتونید انجام بدید