PDA

View Full Version : حرفه ای: روش های مخفی کردن محتویات درون یک تابع



motherboard
یک شنبه 04 خرداد 1393, 22:46 عصر
سلام.توابع اماده ای که در کتابخانه ها وجود داره .محتویاتش مشخص نیست.من هم می خوام تابعی رو که خودم می نویسم محتویات داخل بلوک رو پنهان کنم.کسی چیزی در این مورد می دونه.با تشکر.

rahnema1
دوشنبه 05 خرداد 1393, 13:43 عصر
سلام، اگه می خواهید خودتون یک کتابخانه static ایجاد کنید و احتمالا از devcpp استفاده می کنید می تونید یک new project از نوع Static Library درست کنید سپس در لیست فایلهای پروژه یک فایل با پسوند مثلا cpp ایجاد کنید و در اون کد تابع مورد نظر را بذارید و کمپایل کنید
یک کتابخانه با پسوند a. درست میشه
نحوه استفاده از اون یا اعلان اون تابع را می تونید در یک فایل h قرار بدید که بعدا بتونید include کنید
مثلا یک کتابخونه داریم که یک تابع داره که کارش اینه که یک عدد را دو برابر کنه این کد را به صورت کتابخانه کامپایل کنید:

int doBarabar(int a)
{
return a*2;
}

بعد هم یک فایل myheader.h درست کنید به این صورت

int doBarabar(int);

حالا می خواهید در یک برنامه از این کتابخانه استفاده کنید:
یک پروژه console application درست کنید شامل این کد

#include "myheader.h"
#include <cstdio>
int main()
{
printf("%d",doBarabar(5));
}

فقط می مونه معرفی کردن کتابخانه به برنامه که باید وارد project options بشید و در اونجا در قسمت parameters روی add library or object کلیک کنید و کتابخانه را معرفی کنید فکر کنم دیگه کار دیگه ای نمونده باشه برنامه را کامپایل کنید

(while(c=1) printf(cpp=0
سه شنبه 06 خرداد 1393, 11:41 صبح
سلام، داداش رضا عزیز.
برنامه ای که ما داخل کامپایلرها می نویسیم، بعد از اینکه کامپایل شد، به محتوای خروجیش میگن Object Code (http://en.wikipedia.org/wiki/Object_code) که حاوی کدهای زبان ماشین هست، و این کدها بلافاصله به Object File (http://en.wikipedia.org/wiki/Object_file) تبدیل میشن، و در نهایت توسط برنامه ای به نام Linker (http://en.wikipedia.org/wiki/Linker_%28computing%29)، یک فایل Executable توسط کامپایلر تولید میشه.

کتابخانه استاندارد C شامل توابع از قبل کامپایل شده هست; کدها از قبل کامپایل شدن و به Object File هایی تبدیل شدن که بر اساس نوع تابع، این Object Fileها (کتاب ها) در داخل کتابخانه a. یا lib. یا so. یا dll. برای استفاده نگهداری شدن.
ممکنه در هر کتابخانه یک یا صد Object File وجود داشته باشه; به همین دلیله که میگم به نوع تابع بستگی داره.
در Header Fileها تنها پارامترهای تابع مورد نظر تعریف میشن -- کدهای توابع داخل Object Fileها قرار دارن.
وقتی که توابعت به Object File تبدیل بشه، دیگه ناشناس و نامعلوم میشه -- چون تبدیل شده به زبان ماشین.
می تونستن توابع کتابخانه استاندارد رو تنها در Header Fileها بنویسن، اما اینطوری هم سرعت کامپایل شدن پایین میومد، و هم امکان گند زدن به کدها توسط برخی گند دماغ ها وجود داشت.

می تونستی تابعت رو به طور کامل داخل یک Header File بنویسی، داخل پوشه include (جایی که کامپایلر نصب شده) قرارش بدی، و در نهایت در تابع main، تابعت رو صدا بزنی (Function Call) و ازش استفاده کنی.

می تونستی فقط نام تابع و پارامترهای اون مثل ;(int x (int a, int b رو داخل یک Header File تعریف کنی (Notepad رو باز کن، کدها رو بنویس داخلش، و با هر نامی که میخوای ذخیره اش کن -- اما آخرش یک h. قرار بده) و بگذاریش داخل پوشه include، بعد تابعت رو به طور کامل در یک فایل C. یا Cpp. کامپایل کنی و وقتی که کامپایلر ازش یک Object File تولید کرد، Object File رو داخل یکی از انواع کتابخانه ها قرار بدی و بعدش کتابخانه ات رو داخل پوشه lib (جایی که کامپایلر نصب شده) قرار بدی و درنهایت از کتابخانه و هم از Header File خودت استفاده کنی.

rahnema1 جان در ++DEV C توضیح داد که باید چیکار کنی -- ولی برای استفاده از کتابخانه هات، نیاز نیست که حتما پروژه ای از نوع console application ایجاد کنی -- در پروژه خالی (Empty Project) هم میشه این کار رو کرد.
در ++DEV C، اگر میخوای که از برنامه ات یک Object File تولید بشه، باید حتما یک پروژه ایجاد کنی، وگرنه (با انتخاب Source File (در سربرگ New)) تولید نمیشه.
Object File در همون مسیری که به فایل C. یا Cpp. خودت اختصاص دادی، ایجاد میشه.

در لینوکس و محیط بدون IDE موضوع فرق می کنه، که در زیر، چند آموزش از وبسایت های مختلف قرار دادم.
کتابخانه Static Library (http://en.wikipedia.org/wiki/Static_library) که با پسوند a. شناخته میشه، مخصوص سیستم عامل لینوکس و یونیکس هست.
کتابخانه Static Library که با پسوند lib. شناخته میشه، مخصوص سیستم عامل ویندوز هست.
کتابخانه Shared Library (http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html) که با پسوند so. شناخته میشه، مخصوص سیستم عامل لینوکس و یونیکس هست.
کتابخانه Shared Library که با پسوند dll. شناخته میشه، مخصوص سیستم عامل ویندوز هست.
تفاوت میان این دو کتابخانه (http://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries)
مطالعه کامل درباره کتابخانه ها در ویکی پدیا
(http://en.wikipedia.org/wiki/Library_%28computing%29)مطالعه ۳ (http://www.cs.dartmouth.edu/~campbell/cs50/buildlib.html)
مطالعه ۴ (http://crasseux.com/books/ctutorial/Building-a-library.html)
مطالعه ۵ (http://www.cs.dartmouth.edu/~campbell/cs50/buildlib.html)
مطالعه ۶ (http://www.nongnu.org/avr-libc/user-manual/library.html)
مطالعه ۷ (http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_C_libraries.html)
مطالعه ۸ (https://www.cs.duke.edu/~ola/courses/programming/libraries.html)
مطالعه ۹ (http://http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html)
مطالب بالا، تحت سیستم عامل های Linux و UNIX، کامپایلرهای GCC (مخصوص زبان C) و ++G (مخصوص زبان ++C) (http://en.wikipedia.org/wiki/GNU_Compiler_Collection) نوشته شدن.

موفق باشی.