তৈরি করুন: সবার জন্য কিছুই করার নেই


99

আমি একটি মেক ফাইল তৈরি করতে উদাহরণস্বরূপ পিজিএম দিয়ে যাচ্ছি।

http://mrbook.org/tutorials/make/

আমার ফোল্ডার যেমন_মেক_ক্রিয়েশনতে নিম্নলিখিত ফাইল রয়েছে,

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

মেকফিল

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

ত্রুটি:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

এই প্রোগ্রামটি সংকলন করতে দয়া করে আমাকে বুঝতে সহায়তা করুন।


13
একটি "মেক ক্লিন" করার পরে "মেক অল" এর পরে চেষ্টা করুন
পল আর

11
এটি কোনও ত্রুটি নয়, এটি কেবলমাত্র helloআপ টু ডেট means এটি অপ্রত্যাশিত কিছু cleanকরার rm -f *.o helloআগে পরিবর্তন করুন , তারপরে দৌড়ে যান make clean allএবং দেখুন যে এটি কাজ করে কিনা।
মাদুর

4
আপনারও যুক্ত করা উচিত .phony: all clean, যেহেতু allএবং cleanফাইল ফাইল নয়।
কেরেরেক এসবি

4
আপনার সিএফএলএজেএস-এ রাখবেন না।
ওয়াইল্ডপ্লাজার

উত্তর:


126

কখনও কখনও "সকলের জন্য কিছুই করা যায় না" ত্রুটির কারণে ট্যাবের পরিবর্তে মেকফিল নিয়মে কমান্ড দেওয়ার আগে ফাঁকা জায়গাগুলি ঘটে। দয়া করে নিশ্চিত হয়ে নিন যে আপনি আপনার নিয়মের অভ্যন্তরে ফাঁকের পরিবর্তে ট্যাব ব্যবহার করছেন।

all:
<\t>$(CC) $(CFLAGS) ...

পরিবর্তে

all:
    $(CC) $(CFLAGS) ...

দয়া করে নিয়ম সিনট্যাক্স বর্ণনার জন্য জিএনইউ মেকুয়ালটি দেখুন: https://www.gnu.org/software/make/manual/make.html# বিধি- সিনট্যাক্স


আপত্তি-এম + = হ্যালো.সকল: </t> মেক-সি / লিবিব / মডিউলগুলি / $ (শেল আনামে -আর) / বিল্ড এম = $ (পিডাব্লুডি) মডিউলগুলি পরিষ্কার করুন: মেক-সি / লিবিব / মডিউল / $ ( শেল আনম-আর) / বিল্ড এম = $ (পিডাব্লুডি) পরিষ্কার
নরেন্দ্র জাগি

উপরের ফাইলটি কি বৈধ ফাইল ??
নরেন্দ্র জাগি

পিতা-মাতার শিশু মেকফিলের প্রসঙ্গে, কখনও কখনও "সকলের জন্য কিছুই করা যায় না" ত্রুটি শিশু লক্ষ্যগুলি ভুলভাবে চিহ্নিত হিসাবে চিহ্নিত করা যায় can পিতামাতার মেকফাইলে PHONY।
অনুগ্রহক

আমার ছিল all : src/server/mod_wsgi.la, যা আমি পরিবর্তিত হয়েছে all : </t> src/server/mod_wsgi.la। আমি এখন ত্রুটি পেয়েছি: make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127পরে sudo make। কোন সাহায্য?
মুনক্র্যাটার

@ মুনক্র্যাটার gnu.org/software/make/manual/make.html#Rule- সাইনট্যাক্স দেখুন । এখানে পড়ে: রেসিপি লাইনগুলি একটি ট্যাব অক্ষর দিয়ে শুরু হয় (বা .RECIPEPREFIX ভেরিয়েবলের মানের প্রথম অক্ষর; বিশেষ ভেরিয়েবলগুলি দেখুন)। প্রথম রেসিপি লাইনটি পূর্বশর্তগুলির পরে লাইনটিতে একটি ট্যাব অক্ষর সহ প্রদর্শিত হতে পারে বা সেমিকোলন সহ একই লাইনে উপস্থিত হতে পারে। যেভাবেই হোক, প্রভাবটি একই রকম। সুতরাং, আপনার পূর্বশর্ত সহজভাবে রেসিপি হয়ে উঠেছে। এই ক্ষেত্রে আপনার কোনও ট্যাব লাগবে না।
ভার্চুয়ালভিডিএক্স

31

অপসারণ helloআপনার ফোল্ডার থেকে ফাইলটি এবং আবার চেষ্টা করুন।

allলক্ষ্য উপর নির্ভর করে helloলক্ষ্য। helloলক্ষ্য প্রথম ফাইলসিস্টেম সংশ্লিষ্ট ফাইল খুঁজতে চেষ্টা করে। যদি এটি এটি খুঁজে পায় এবং নির্ভরযোগ্য ফাইলগুলির সাথে এটি আপ টু ডেট থাকে do কিছুই করার নেই।


আপত্তি-এম + = হ্যালো.সকল: </t> মেক-সি / লিবিব / মডিউলগুলি / shell (শেল আনামে -আর) / বিল্ড এম = $ (পিডাব্লুডি) মডিউলগুলি পরিষ্কার করুন: মেক-সি / লিবিব / মডিউল / $ ( শেল আনম-আর) / বিল্ড এম = $ (পিডব্লিউডি) পরিষ্কার
নরেন্দ্র জাগি

উপরেরটি কি একটি বৈধ মেক ফাইল?
নরেন্দ্র জাগি

21

আপনি যখন সবেমাত্র মেক দিন, এটি আপনার মেকফাইলে প্রথম বিধি তৈরি করে, যেমন "সমস্ত"। আপনি উল্লেখ করেছেন যে "সমস্ত" "হ্যালো" এর উপর নির্ভর করে যা মূল.ও, ফ্যাক্টরিয়াল.ও এবং হ্যালো.ও এর উপর নির্ভর করে। সুতরাং 'তৈরি করুন' সেই ফাইলগুলি উপস্থিত কিনা তা দেখার চেষ্টা করে।

যদি তারা উপস্থিত থাকে তবে 'তৈরি করুন' তাদের নির্ভরতা যেমন, মেইন.ও এর নির্ভরশীলতা মেইন.সি. রয়েছে কিনা তা পরিবর্তন করে sees যদি তারা পরিবর্তিত হয়, তাদের পুনর্নির্মাণ করুন, অন্যথায় নিয়ম এড়িয়ে যান। একইভাবে এটি পুনরাবৃত্তভাবে পরিবর্তিত ফাইলগুলি তৈরিতে অবশেষে চলে যায় এবং আপনার ক্ষেত্রে একটি নির্বাহী, 'হ্যালো' দেওয়ার জন্য আপনার ক্ষেত্রে সর্বাধিক কমান্ড "সমস্ত" চালায়।

যদি তারা উপস্থিত না থাকে, নিয়মের আওতায় অন্ধভাবে সবকিছু তৈরি করুন।

আপনার সমস্যায় আসছে, এটি ত্রুটি নয় তবে 'মেক' বলছে যে আপনার মেকফিলের প্রতিটি নির্ভরতা আপ টু ডেট এবং এটির জন্য কিছু করার দরকার নেই!


16

মেক সঠিক আচরণ করছে। helloইতোমধ্যে উপস্থিত রয়েছে এবং .cফাইলগুলির চেয়ে পুরানো নয় , এবং কাজ করার মতো আর কোনও কাজ নেই। এখানে চারটি পরিস্থিতি রয়েছে যার জন্য পুনরায় নির্মাণের প্রয়োজন হবে:

  • আপনি যদি আপনার .cফাইলগুলির মধ্যে একটি পরিবর্তন করেন তবে এটি তার চেয়েও নতুন helloহবে এবং আপনি যখন রান করবেন তখন এটি পুনর্নির্মাণ করতে হবে।
  • আপনি যদি মুছে ফেলেন hello, তবে অবশ্যই এটি পুনর্নির্মাণ করতে হবে
  • আপনি -Bবিকল্পটি দিয়ে সবকিছু পুনর্নির্মাণ করতে বাধ্য করতে পারেন ।make -B all
  • make clean all মুছে ফেলবে hello এবং পুনর্নির্মাণের প্রয়োজন । (আমি আপনাকে @ ম্যাট এর মন্তব্য সম্পর্কে সন্ধান করার পরামর্শ দিচ্ছি)rm -f *.o hello

4

আমি মনে করি আপনি 9 ম লাইনে একটি ট্যাব মিস করেছেন। লাইন সমস্ত অনুসরণ করে: হ্যালো অবশ্যই একটি ফাঁকা ট্যাব হবে। 9 তম লাইনে আপনার ফাঁকা ট্যাব রয়েছে তা নিশ্চিত করুন। এটি দোভাষীকে বুঝিয়ে দেবে যে আপনি মেকফিলের জন্য ডিফল্ট রেসিপিটি ব্যবহার করতে চান।


4

এটি ত্রুটি নয়; ইউনিক্সে মেক কমান্ড টাইমস্ট্যাম্পগুলির উপর ভিত্তি করে কাজ করে। আমি বলি যে আপনি যদি কিছু নির্দিষ্ট পরিবর্তন করে factorial.cppব্যবহার করে সংকলন করে থাকেন makeতবে সেই তথ্যগুলি দেখান যা কেবল cc -o factorial.cppকমান্ড সম্পাদিত হয়। পরের বার আপনি যদি একই কমান্ডটি চালিত করেন অর্থাত্ এক্সপেনশন makeসহ কোনও ফাইলে কোনও পরিবর্তন না .cppকরেই কম্পাইলার বলে যে আউটপুট ফাইলটি আপ টু ডেট। সংকলকটি আমাদের যে কোনওটিতে নির্দিষ্ট পরিবর্তন না করা পর্যন্ত এই তথ্য দেয়file.cpp

এর সুবিধাটি makefileহ'ল এটি কেবলমাত্র সংশোধিত ফাইলগুলিকে সংকলন করে এবং .oসোজাবিহীন ফাইলগুলির অবজেক্ট ( ) ফাইলগুলি ব্যবহার করে পুনরায় সংযোগের সময় হ্রাস করে ।


0

আমি এই অদ্ভুত জায়গায় পৌঁছেছি, একটি ভিন্ন রুট দিয়ে হার্ড-টু-ডিবাগ ত্রুটি through লক্ষ্য এবং নির্ভরতা পৃথক ডিরেক্টরিতে অবস্থিত হওয়ার পরে আমি একটি বিল্ড স্টেপে প্যাটার্ন রুলটি ব্যবহার করছি বলে আমার ঝামেলা শেষ হয়েছিল। এটার মতো কিছু:

foo/apple.o: bar/apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o $@

আমার বেশ কয়েকটি নির্ভরতা এইভাবে সেট আপ হয়েছিল এবং তাদের সবার জন্য একটি প্যাটার্ন রেসিপি ব্যবহার করার চেষ্টা করছিলাম। স্পষ্টতই, "%" এর জন্য একটি একক বিকল্প এখানে কাজ করবে না। আমি প্রতিটি নির্ভরতার জন্য সুস্পষ্ট নিয়ম তৈরি করেছি এবং আমি নিজেকে কুকুরছানা এবং ইউনিকর্নের মধ্যে ফিরে পেয়েছি!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

আশা করি এটি কাউকে সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.