জিসিসি মেকফিল ত্রুটি: "লক্ষ্য তৈরি করার কোনও নিয়ম নেই ..."


355

আমি আমার প্রকল্পটি সংকলন করতে একটি মেকফিল দিয়ে জিসিসি (লিনাক্স) ব্যবহার করার চেষ্টা করছি।

আমি নিম্নলিখিত ত্রুটিটি পেয়েছি যা এটি এই প্রসঙ্গে ডিসিফার করে না বলে মনে হচ্ছে:

"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."

এটি হ'ল মেকফাইল:

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

main.o: main.cpp main.h
    g++ -c main.cpp

vertex.o: vertex.cpp vertex.h
    g++ -c vertex.cpp

edge.o: edge.cpp edge.h
    g++ -c num.cpp

vlist.o: vlist.cpp vlist.h
    g++ -c vlist.cpp

elist.o: elist.cpp elist.h
    g++ -c elist.cpp

vnode.o: vnode.cpp vnode.h
    g++ -c vnode.cpp

enode.o: enode.cpp enode.h
    g++ -c node.cpp

2
উত্স ফাইলটি 'অস্তিত্বহীন' করার একটি সাধারণ উদাহরণ হ'ল ভুল হিসাবে ভিপিএটিএইচ বা এসআরসি ভেরিয়েবলটি পুনরায় সেট করা যখন আপনাকে এটি যুক্ত করতে হয়। আমি VPATH=পরিবর্তে usnig মানে VPATH+=। এটি মেকফিল ফাইলটি ফাইলটি দেখতে পারে না যখন ফাইলটি আসলে সেখানে থাকে।
চান কিম

উত্তর:


424

এটি সাধারণত কারণ আপনার vertex.cppকাছে তৈরি করার জন্য উপলব্ধ কোনও ফাইল নেই । যে পরীক্ষা:

  • যে ফাইল বিদ্যমান।
  • আপনি তৈরি করার সময় আপনি সঠিক ডিরেক্টরিতে রয়েছেন।

তা ছাড়া, আমি প্রস্তাব করার মতো খুব বেশি কিছু করি না। সম্ভবত আপনি আমাদের ডিরেক্টরিতে একটি ডিরেক্টরি তালিকা দিতে পারে।


2
হ্যাঁ, আমার কয়েকটি ক্লাসে .cpp ফাইল নেই, সুতরাং সেগুলি সেখানে নেই causing ত্রুটির কারণ হয়েছিল। ধন্যবাদ।
মির 14

4
যদি কিছু হেডার ফাইল যেগুলি আপনি মুছে রয়েছে কিন্তু আপনার Makefile নামক এখনও আপনার কাছে এই ধরনের একটি ত্রুটি পেতে পারেন
Ady

@ পার, এটি আমার কাছে অন্যরকম প্রশ্নের মতো দেখাচ্ছে। আপনি যদি এটি একটি প্রশ্ন হিসাবে জিজ্ঞাসা করেন তবে আপনি সম্ভবত আরও এক্সপোজার পাবেন ।
paxdiablo

এছাড়াও, আপনার মেকফিলটিকে সম্পাদনা করার পরে আপনি সংরক্ষণ করেছেন তা নিশ্চিত করুন ... এটি আমাকে পেয়েছে। আমি আমার সমস্ত সম্পাদনাগুলি করেছি তখন সিটিআরএল + এস
টিম

80

আমার অভিজ্ঞতায়, এই ত্রুটিটি প্রায়শই বানান ত্রুটির কারণে ঘটে।

আমি আজ এই ত্রুটি পেয়েছি।

[1]: *** টার্গেট maintenaceDialog.cpp', needed byমেইনটনেসডায়ালগ.ও ' করার কোনও নিয়ম নেই । স্টপ।

আমার ক্ষেত্রে ত্রুটিটি কেবল একটি বানানের ত্রুটি ছিল। মাইনটেন্স শব্দটি অনুপস্থিত ছিল এটি তৃতীয় এন N

আপনার ফাইলের নামগুলিতেও বানান পরীক্ষা করুন।


2
মেটা কেন , এক্ষেত্রে অবজেক্ট / উত্স / শিরোনামের সম্পর্কগুলি স্পষ্টভাবে তালিকাভুক্ত করার কারণে। সাবকনস বা সিএমকেকের মতো নতুন সরঞ্জামগুলি যদি স্বাদ না নেয়gcc -MT এবং gnu মেইন প্যাটার্নগুলি এটি সমাধান করতে পারে। এছাড়াও দেখুন ।
নাথান কিড

তুমি আমার দিন বাঁচিয়েছ! ধন্যবাদ! :)
সুনিত গৌতম

আমার ক্ষেত্রে পথটি ভুল ছিল ../../src/file.cতবে আসলে এটি ছিল../../src/folder/file.c
রাসমি রঞ্জন নায়ক

31

এই বার্তাটি মুদ্রিত হওয়ার আরও সাধারণ কারণ হ'ল আপনি যে ডিরেক্টরিটিতে উত্স ফাইলটি অন্তর্ভুক্ত রয়েছে তা অন্তর্ভুক্ত করতে ভুলে গেছেন। ফলস্বরূপ, জিসিসি এই "ফাইল" বিদ্যমান বলে মনে করে।

আপনি গিসি-তে আর্গুমেন্ট ব্যবহার করে ডিরেক্টরিটি যুক্ত করতে পারেন।


14

আমার ক্ষেত্রে আমি বিভাজনকারী হিসাবে হাড়-মাথা দিয়ে কমা ব্যবহার করেছি। আপনার উদাহরণ ব্যবহার করতে আমি এটি করেছি:

a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

এর সমতুল্যে পরিবর্তন করা

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

ঠিক কর.


11

এটা কি ঠিক? মনে রাখবেন যে মেকফিল সিনট্যাক্সটি হোয়াইটস্পেস সচেতন এবং ক্রিয়াকলাপের অধীনে কমান্ডগুলি ইনডেন্ট করার জন্য ট্যাবগুলির প্রয়োজন।


7

আমি যে সমস্যাটি পেয়েছি তা অন্যান্য লোকেরা উল্লিখিত চেয়েও চটজলদি ছিল।

আমাদের মেকফিলগুলি তৈরি করার জন্য পাসের তালিকা পেয়ে যায়। কেউ TheOtherLibraryতালিকার একটিতে যুক্ত করেছেন , নীচে দেখানো হয়েছে।

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

তাদের এটি করা উচিত ছিল:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

যদি তারা এটি দ্বিতীয় উপায়ে সম্পন্ন করে, তবে তারা Libraryবিল্ডটি নিশ্চিহ্ন করতে পারত না । প্লাস ইন +=খুব গুরুত্বপূর্ণ।


6

আমার ক্ষেত্রে এটি মেকফাইলে একাধিক-লাইন বিধি ত্রুটির কারণে হয়েছিল। আমার মতো কিছু ছিল:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o \
OBJS-$(CONFIG_OBJ2)            += file5.o 
OBJS-$(CONFIG_OBJ3)            += file6.o
...

CONFIG_OBJ1নিয়মের ফাইল তালিকার শেষে ব্যাকস্ল্যাশ এই ত্রুটি ঘটায়। এটির মতো হওয়া উচিত:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o
OBJS-$(CONFIG_OBJ2)            += file5.o
...

5

প্রায়শই একটি ভুল অন্য ফাইলের নামে টাইপও হতে পারে ।

আপনার উদাহরণটি বেশ সোজা, তবে যা কখনও কখনও বিভ্রান্ত হতে পারে তা makeনিজের বার্তা । একটি উদাহরণ বিবেচনা করা যাক।

আমার ফোল্ডারের সামগ্রীগুলি হ'ল:

$ ls -1
another_file
index.md
makefile

আমার makefileচেহারা যেমন

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo $@ $<

যদিও index.mdএটি আমার উচিত ছিল যেখানে এটি হওয়া উচিত এবং এর নামে কোনও ভুল নেই, তবে বার্তাটি makeহবে

make: *** No rule to make target `index.html', needed by `all'.  Stop.

সত্যি কথা বলতে বার্তাটি বিভ্রান্তিকর । এটি কেবল বলে, কোনও নিয়ম নেই। আসলে, এর অর্থ এই যে নিয়মটি ভুল, তবে ওয়াইল্ডকার্ড (প্যাটার্ন) বিধিগুলির কারণেmake কারণে সমস্যাটি ঠিক কী তা নির্ধারণ করতে পারে না।

makefileসামান্য পরিবর্তন করতে দেয় যা স্পষ্ট নিয়মের সাহায্যে নিদর্শনগুলি প্রতিস্থাপন করে বলে:

index.html: index.md wrong_path_to_another_file

এবং এখন আমরা যে বার্তাটি পাই তা হ'ল:

make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.

অলৌকিক ঘটনা! নিম্নলিখিত উপসংহারে আসতে পারে:

  • এর বার্তা makeনিয়মের উপর নির্ভর করে এবং সবসময় সমস্যার মূলকে নির্দেশ করে না

  • makefileএই বার্তাটির দ্বারা নির্দিষ্ট করা থেকে আলাদা আপনার অন্যান্য সমস্যাও থাকতে পারে

এখন আমরা একটি নিয়মে অন্যান্য নির্ভরতাগুলি পরীক্ষা করার ধারণাটি নিয়ে এসেছি :

all: index.html

%.html: %.md another_file
    @echo $@ $<

কেবল এটিই আমাদের কাঙ্ক্ষিত ফলাফল প্রদান করবে:

$ make
index.html index.md

3

আমার ক্ষেত্রে, ত্রুটি বার্তাটি একটি পুরানো ফাইলনামকে উল্লেখ করেছে, এটি পুনরায় নামকরণের কারণে এটি আর বিদ্যমান ছিল না। দেখা গেল যে পুরানো তথ্য মেকফিল থেকে আসে না, .depsডিরেক্টরিতে ফাইল থেকে আসে ।

একটি মেশিন থেকে অন্য মেশিনে ফাইলগুলি অনুলিপি করার পরে আমি এই ত্রুটির মধ্যে পড়েছিলাম। এই প্রক্রিয়াতে, আমি ধরে নিই যে টাইমস্ট্যাম্পগুলি একটি বেমানান অবস্থায় পেয়েছে, যা সমান্তরালভাবে একাধিক কাজ চালানোর সময় "তৈরি" করতে বিভ্রান্ত হয় ( এই বাগের প্রতিবেদনের অনুরূপ )।

এর সাথে সিক্যুয়াল বিল্ডগুলি make -j 1প্রভাবিত হয়নি, তবে বুঝতে পেরে আমাকে কিছুটা সময় লেগেছে কারণ আমি একটি উলাম ( make -j 8) ব্যবহার করছি ।

রাষ্ট্র পরিষ্কার করার জন্য, আমি সমস্ত .depsফাইল সরিয়ে দিয়ে মেকফিলটি পুনরায় জেনারেট করেছি। এই হুকুম আমি ব্যবহার করেছি:

find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure

এর পরে, বিল্ডিং আবার কাজ করে।


2

আপনি যদি জন দ্য রিপারকে "রক্তক্ষরণ-জাম্বো" তৈরি করার চেষ্টা করছেন এবং "মেক: *** 'টার্গেট' লিনাক্স-এক্স 86-64 '" করার কোনও নিয়ম নেই। পরিবর্তে এই আদেশটি চালানোর চেষ্টা করুন:./configure && make


0

আমার ক্ষেত্রে, উত্স এবং / বা পুরাতন অবজেক্ট ফাইল (গুলি) আধা-ক্র্যাশ হওয়া আইডিই দ্বারা বা ব্যাকআপ ক্লাউড পরিষেবা থেকে লক করা হয়েছিল (যা সঠিকভাবে কাজ করা বন্ধ করে দিয়েছে)। ফোল্ডার কাঠামোর সাথে সম্পর্কিত সমস্ত প্রোগ্রাম এবং পরিষেবাগুলি পুনরায় চালু করা সমস্যার সমাধান করেছে।


0

একটি অদ্ভুত সমস্যা এবং এর সমাধানের আরও একটি উদাহরণ:

এই:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

দেয়: make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

তবে আমি যদি Poco_LIBRARIESএটি সরিয়ে ফেলি তবে এটি কার্যকর হয়:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

আমি ম্যাকের উপরে ক্ল্যাং 8 এবং লিনাক্সে ক্ল্যাং 3.9 ব্যবহার করছি সমস্যাটি কেবল লিনাক্সেই দেখা দেয় তবে ম্যাকের জন্য কাজ করে!

আমি উল্লেখ করতে ভুলে গেছি: Poco_LIBRARIESভুল ছিল - এটি cmake / find_package দ্বারা সেট করা হয়নি!


0

আমার ক্ষেত্রে পথটি ভিপিএটিএইচ-তে সেট করা হয়নি, যুক্ত করার পরে ত্রুটি চলে গেছে।


0

এই ত্রুটির জন্য একাধিক কারণ রয়েছে।

লিনাক্স এবং উইন্ডো তৈরি করার সময় আমি এই ত্রুটির মুখোমুখি হওয়ার একটি কারণ।

আমার ক্যাপস বেসক্লাস সহ একটি ফাইলের নাম আছে। সাবক্লাস। ইউনিক্সের কেস-সংবেদনশীল ফাইলনামিং কনভেনশন রয়েছে এবং উইন্ডোজগুলি কেস-সংবেদনশীল।

সি ++ কেন শিরোনাম ফাইলগুলির নামে লোকেরা বড় হাতের অক্ষর ব্যবহার করে না?

আপনি যদি গেমকে ব্যবহার করছেন তবে গেমকে ক্লিন ব্যবহার করে ক্লিন বিল্ড সংকলন করে দেখুন

কিছু পাঠ্য সম্পাদকের ক্ষেত্রে কেস-সংবেদনশীল ফাইলের নাম উপেক্ষা করার জন্য ডিফল্ট সেটিংস রয়েছে। এটি একই ত্রুটি হতে পারে।

কিউটি ক্রিয়েটারে একটি সি ++ ফাইল কীভাবে যুক্ত করবেন যার নাম রাজধানী অক্ষর দিয়ে শুরু হয়? এটি স্বয়ংক্রিয়ভাবে এটি একটি ছোট অক্ষর করে তোলে


0

ট্র্যাভিসের ভিতরে এই ত্রুটিটি ঘটেছিল যখন আমি আমার গিট রিপোজিটরিতে নতুন ফাইল যুক্ত করতে ভুলে গিয়েছিলাম। বোকা ভুল, তবে আমি দেখতে পাচ্ছি এটি বেশ সাধারণ।


-1

আমার ক্ষেত্রে, এটি আমাকে মেকফিলকে কল করার কারণে হয়েছিল: মেকফাইল (সমস্ত ক্যাপ)

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