আমি কি এসআরসি / টু .o এর ইনজেক্ট / এ সমস্ত .cpp ফাইলগুলি সংকলন করতে পারি, তারপরে ./ এ বাইনারি লিঙ্ক করতে পারি?


116

আমার প্রকল্প ডিরেক্টরিটি দেখতে এমন দেখাচ্ছে:

/project
    Makefile
    main
    /src
        main.cpp
        foo.cpp
        foo.h
        bar.cpp
        bar.h
    /obj
        main.o
        foo.o
        bar.o

আমি সব কম্পাইল করতে হবে না আমার Makefile চাই কি .cppফাইল /srcফোল্ডার .oফাইল /objফোল্ডারের, তারপর সব লিঙ্ক .oফাইল /objটপ লেভেল ফোল্ডারে আউটপুট বাইনারি মধ্যে /project

আমার মেকফিলসের কোনও অভিজ্ঞতার পরে নেই এবং এটি সম্পাদন করার জন্য কী অনুসন্ধান করতে হবে তা সত্যই আমি নিশ্চিত নই।

এছাড়াও, এটি করার জন্য এটি কি একটি "ভাল" উপায়, বা আমি যা করার চেষ্টা করছি তার আরও মানক পদ্ধতির রয়েছে?



6
@ আআআ: আমি অনুমান করছি যে ওপি এমন একটি সমাধান চায় যা প্রতিটি উত্স ফাইলকে স্পষ্টভাবে তালিকাভুক্ত করার প্রয়োজন নেই।
ক্যাসাবেল

7
আমি আমার প্রতিটি উত্স ফাইল নির্দিষ্ট করতে চাই না, এবং আমি আগে এই ম্যানুয়ালটি পড়ার চেষ্টা করেছি, তবে আমি এটি বিশৃঙ্খলাযুক্ত এবং বুঝতে অসুবিধাজনক বলে মনে করি। শুকনো প্রযুক্তিগত ম্যানুয়ালগুলির চেয়ে আমি প্রকৃত উদাহরণ থেকে অনেক ভাল শিখি যা আমি প্রত্যাশা করি যা করে এবং ভালভাবে ব্যাখ্যা করা হয়।
অস্টিন হাইড

ঠিক আছে. তবে ডকুমেন্টেশনগুলি ভাল উদাহরণগুলির সাথে দুর্দান্ত (এটি প্রযুক্তিগত ম্যানুয়াল চেষ্টা করে না)। আপনি প্যাটার্ন বিধিগুলি খুঁজছেন: gnu.org/software/make/manual/make.html#
যেকোনওর্ন

11
এটি দেখতে আমি যা চাই তার মতো আরও কিছুটা। যদিও আইএমএইচও, মেক ম্যানুয়ালটি কিছুটা শুকনো, কারণ এটি এমন বিকাশকারীদের পক্ষে আরও লক্ষ্যবস্তু বলে মনে হয় যারা মেক দিয়ে মধ্যবর্তী স্তরে রয়েছেন এবং এর বাইরেও এটি খুব বড় এবং গভীরতর। সম্ভবত খুব বেশি।
অস্টিন হাইড

উত্তর:


180

প্রশ্নের অংশ Makefile

এটি বেশ সহজ, যদি না আপনার নীচের কোডের মতো কিছু চেষ্টা করার প্রয়োজন হয় (তবে জি ++ এর নিকটে ট্যাবগুলির সাথে স্পেস ইনডেন্টেশন প্রতিস্থাপন করুন)

SRC_DIR := .../src
OBJ_DIR := .../obj
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))
LDFLAGS := ...
CPPFLAGS := ...
CXXFLAGS := ...

main.exe: $(OBJ_FILES)
   g++ $(LDFLAGS) -o $@ $^

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
   g++ $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

স্বয়ংক্রিয় নির্ভরতা গ্রাফ উত্পাদন

বেশিরভাগ মেক সিস্টেমের জন্য "অবশ্যই" বৈশিষ্ট্য। যোগ করে সংকলন একটি পার্শ্ব প্রতিক্রিয়া হিসাবে একটি একক পাস করা যাবে মধ্যে জিসিসি সঙ্গে -MMDপতাকা CXXFLAGSএবং -include $(OBJ_FILES:.o=.d) Makefile শরীর শেষে:

CXXFLAGS += -MMD
-include $(OBJ_FILES:.o=.d)

এবং ছেলেরা ইতিমধ্যে উল্লিখিত হিসাবে, সর্বদা জিএনইউ মেকুয়ালটিকে চারপাশে রাখুন, এটি খুব সহায়ক।


11
আহ্, আপনি আমাকে কয়েক সেকেন্ডের মধ্যে মারলেন। তবে আমি পরামর্শ দিই OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
বিটা

1
এটি কাজ করার জন্য আমাকে এটি পরিবর্তন করতে হয়েছিল: মেইন.এক্সির নিয়মের জন্য $<হওয়া উচিত $^এবং আমি মনে করি একটি টাইপও আছে obj/%.o: src/%cpp

1
@ বোবাহ আপনি একটি 'মিস করছেন'।
সিপিপির

1
বিশেষ ভেরিয়েবলগুলি সম্ভবত ব্যাখ্যা করার মতো, যেহেতু তারা মেকফিল নির্দিষ্ট এবং সন্ধান করা কঠিন: gnu.org/software/make/manual/html_node/ অটোমেটিক
ব্লেক

2
আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি আমার প্রকল্প অনুসারে কিছুটা পরিবর্তন করেছি, তবে এটি কার্যকর হচ্ছে না। এখানে আমার মেকফাইলটি রয়েছে: পেস্টবিন. com/ 4CksG9Wc আমি কনসোলে উঠছি:make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
ম্যাটিউস ফিলিপ

5

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

BASEDIR = ../..
SRCDIR = $(BASEDIR)/src
INSTALLDIR = $(BASEDIR)/lib

MODULES = $(wildcard $(SRCDIR)/*.cpp)
OBJS = $(wildcard *.o)

আপনি কি ফরোয়ার্ড স্ল্যাশ বোঝাতে চেয়েছিলেন? আপনার উদাহরণ দেখায় যে traditionতিহ্যগতভাবে ফরোয়ার্ড স্ল্যাশ হিসাবে বিবেচিত হয়। বিশেষত, "ডান দিকে ঝুঁকে" এবং "বাম দিকে" বলে মনে করা হয়
ইভান তেরান

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