আমি কীভাবে লিনাক্সে জিসিসির জন্য একটি সাধারণ মেকফাইল তৈরি করব?


130

আমি তিনটি ফাইল আছে: program.c, program.hএবং headers.h

program.cঅন্তর্ভুক্ত program.hএবং headers.h

আমার এটি জিসিসি সংকলক ব্যবহার করে লিনাক্সে সংকলন করতে হবে । আমি কীভাবে এটি করব তা নিশ্চিত নই। নেটবিয়ান আমার জন্য একটি তৈরি করেছে, তবে এটি খালি।


1
স্পিন.টমিকোবজেক্ট.কম / ২০১/0 / ২০১৮ / 26 / মেকেফাইল- সি-প্রকল্পগুলিতে একটি অত্যন্ত মার্জিত (এবং ভাল ডকুমেন্টেড) সমাধান রয়েছে ।
কেসি

উত্তর:


193

আকর্ষণীয়, আমি জানতাম না যে উত্স ফাইলগুলি সম্পর্কিত সি সংকলক প্রদত্ত নিয়মগুলি ব্যবহার করে মেকটি ডিফল্ট হবে।

যাইহোক, একটি সাধারণ সমাধান যা সাধারণ মেকফিল ধারণাগুলি প্রদর্শিত করে:

HEADERS = program.h headers.h

default: program

program.o: program.c $(HEADERS)
    gcc -c program.c -o program.o

program: program.o
    gcc program.o -o program

clean:
    -rm -f program.o
    -rm -f program

(মনে রাখবেন যে স্পেস ইনডেন্টেশনের পরিবর্তে ট্যাবটি তৈরি করা দরকার, তাই অনুলিপি করার সময় এটি ঠিক করতে ভুলবেন না)

তবে, আরও সি ​​ফাইলগুলিকে সমর্থন করতে আপনাকে তাদের প্রত্যেকের জন্য নতুন নিয়ম তৈরি করতে হবে। সুতরাং, উন্নতি করতে:

HEADERS = program.h headers.h
OBJECTS = program.o

default: program

%.o: %.c $(HEADERS)
    gcc -c $< -o $@

program: $(OBJECTS)
    gcc $(OBJECTS) -o $@

clean:
    -rm -f $(OBJECTS)
    -rm -f program

আমি সাধারণত মেকফিলগুলিতে দেখা যায় এমন $ (সিসি) এবং $ (সিএফএলএজিএস) এর মতো ভেরিয়েবলগুলি বাদ দিয়ে এটিকে যথাসম্ভব সহজ করার চেষ্টা করেছি। যদি আপনি এটি সন্ধান করতে আগ্রহী হন তবে আমি আশা করি যে আমি আপনাকে এটির একটি ভাল সূচনা দিয়েছি।

সি উত্সের জন্য আমি মেকফাইলটি ব্যবহার করতে চাই। এটি বিনামূল্যে নির্দ্বিধায়:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

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

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

বর্তমান ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে .c এবং .h ফাইলগুলি অন্তর্ভুক্ত করার জন্য এটি মেক ইউটিলিটির ওয়াইল্ডকার্ড এবং প্যাটসবস্ট বৈশিষ্ট্যগুলি ব্যবহার করে, এর অর্থ যখন আপনি যখন আপনার ডিরেক্টরিতে নতুন কোড ফাইল যুক্ত করবেন তখন আপনাকে মেকফাইল আপডেট করতে হবে না। তবে, আপনি যদি উত্পাদিত এক্সিকিউটেবল, লাইব্রেরি বা সংকলক পতাকাগুলির নাম পরিবর্তন করতে চান তবে আপনি কেবল ভেরিয়েবলগুলি পরিবর্তন করতে পারেন।

উভয় ক্ষেত্রে, অটোকনফ ব্যবহার করবেন না, দয়া করে। আমি তোমাকে চাচ্ছি! :)


7
প্রযুক্তিগতভাবে সঠিক হতে, আমি বিশ্বাস করি যে আপনার .PHONY: clean all defaultলক্ষ্যগুলি কমান্ড লাইন থেকে ব্যবহার করা উচিত সেই লক্ষ্যগুলির জন্য ব্যবহার করা উচিত । এছাড়াও, অটোকনফ / অটোমেক খারাপ নয়। অবশ্যই, তারা ভয়ঙ্কর বোধ করে এবং তাদের অভ্যস্ত করা ইট প্রাচীরের মধ্য দিয়ে আপনার মাথা জোর করার মতো মজাদার তবে তারা কাজ করে এবং এগুলি খুব ভালভাবে বিকশিত হয় এবং তারা আপনার বেশিরভাগ ঘাঁটিটি বহনযোগ্যতা পর্যন্ত coverেকে রাখবে, আপনি একবারে তাদের ভয়ঙ্কর ডিজাইনে অভ্যস্ত হয়ে উঠলে এবং আপনার জীবনটি শেষ পর্যন্ত অনেক সহজ করে তুলবে।
ক্রিস লুটজ

আমার ধারণা এটি কাজ করে তবে আমি ভেবেছিলাম যে আমি যদি টার্মিনালে "মেক" টাইপ করি তবে প্রোগ্রামটি চালানো উচিত। আমি যা পাই তা হ'ল: gcc statsh.o -Wall -lm -o prog প্রোগ্রামটি কি কেবল মেকিং টাইপ করে প্রোগ্রাম চালানো সম্ভব?
ব্যবহারকারী 69514

আপনি কোথায় ওপেনপ্যাম পতাকাটি যুক্ত করবেন
ফ্লোপ্যাম্প

1
অটোকনফ জয়ে-অ্যাডামস ব্যবহার করবেন না কেন?
মিশাল গন্ডা

7
যদি কেউ আশ্চর্য হয়ে থাকে যে কেন সামনে ড্যাশ রয়েছে rm: স্ট্যাকওভারফ্লো.com
টোর ক্লিংবার্গ

25

উদাহরণস্বরূপ এই সাধারণ মেকফিলটি পর্যাপ্ত হওয়া উচিত:

সিসি = জিসিসি 
CFLAGS = -Wall

all: প্রোগ্রাম
প্রোগ্রাম: program.o
program.o: program.c program.h headers.h

পরিষ্কার:
    rm -f প্রোগ্রাম program.o
প্রোগ্রাম চালু করুন
    ./কার্যক্রম

নোট <tab>করুন পরিষ্কার এবং রান করার পরে পরবর্তী লাইনে অবশ্যই ফাঁকা স্থান নয়।

আপডেট আপডেট নীচে মন্তব্য


@ user69514: makeকোন যুক্তি দিয়ে সাধারণত গড়ে তুলতে আপনার সফ্টওয়্যার। এটি চালানোর জন্য, হয় ব্যবহার করুন make run(এই জবাবটি উপলভ্য, তবে সমস্ত ক্ষেত্রেই এটি প্রয়োজন নয় Makefile), অথবা সরাসরি চালান:./program
মাস্ট্রেলিয়ন

14
all: program
program.o: program.h headers.h

যথেষ্ট। বাকি অন্তর্নিহিত


1
এবং যদি আপনার পুরো প্রোগ্রামটি একটি একক .cফাইল হয় তবে কেবল program:প্রয়োজনীয়। মিষ্টি :)
MestreLion

10

সহজ মেক ফাইল হতে পারে

all : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

clean :
        rm test *.o

আপনার মেকফিল কী করে তা বোঝাতে আপনি আরও বিশদ যুক্ত করতে পারেন
ফেডেরিকো

2
আপনি আসলে অনেক সহজ যেতে পারেন। @ অজ্ঞাতনামা 1 টি লাইনার দেখুন
অজ্ঞাতনামা

0

শিরোনামের সংখ্যা এবং আপনার বিকাশের অভ্যাসের উপর নির্ভর করে আপনি gccmakedep তদন্ত করতে চাইতে পারেন। এই প্রোগ্রামটি আপনার বর্তমান ডিরেক্টরিটি পরীক্ষা করে এবং মেকফাইলের শেষে প্রতিটি .c / cpp ফাইলের শিরোনাম নির্ভরতা যুক্ত করে। আপনার যখন 2 টি শিরোনাম এবং একটি প্রোগ্রাম ফাইল থাকে তখন এটি ওভারকিল হয়। তবে, যদি আপনার কাছে 5+ ছোট পরীক্ষার প্রোগ্রাম থাকে এবং আপনি 10 টির মধ্যে একটি শিরোনাম সম্পাদনা করছেন তবে আপনি ঠিক সেই প্রোগ্রামগুলি পুনর্নির্মাণ করতে বিশ্বাস করতে পারেন যা আপনার পরিবর্তনগুলি পরিবর্তন করেছিল changed

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