একটি .ino আরডুইনো স্কেচ সরাসরি জিসিসি-এভিআর সংকলন করবে?


10

ঠিক আছে, আমরা সকলেই সেই প্রশ্নগুলি পুরো ওয়েব জুড়ে দেখেছি যেমন আরডিনো বনাম সি ++, বা অন্যান্য অনুরূপ প্রশ্নগুলি। এবং উত্তরগুলির বিস্তৃত অংশ এমনকি বিমূর্ত তথ্যের মাধ্যমে সংকলন পার্থক্য স্পর্শ করে না।

আমার প্রশ্নের উদ্দেশ্য হ'ল আসল পার্থক্যগুলি (পছন্দগুলি নয়) সমাধান করা যা একটি .ino ফাইলকে একটি .cpp ফাইলের নতুন নামকরণ করা হবে বা সি ++ এর জন্য অন্যান্য অনুরূপ ফাইল এক্সটেনশানটি জিসিসি-এভিআর ব্যবহার করে সংকলন করবে। আমি জানি যে সর্বনিম্ন আপনাকে আড়ডিনো হেডার ফাইলটি অন্তর্ভুক্ত করতে হবে, তবে এর বাইরে, সংকলনটি .ino থেকে .cpp ফাইল ব্যবহার করে যদি বলি, উদাহরণস্বরূপ জিসিসি-এভিআর বলে তবে একটি সংকলন ত্রুটি ঘটবে কি না। সরলতার জন্য, পার্থক্য কী তা বোঝাতে ক্লাসিক ঝলক উদাহরণ ব্যবহার করুন। অথবা যদি আপনার আরও ভাল কোড স্নিপেট ব্যবহার করার থাকে তবে দয়া করে সর্বদা আপনার উত্তরে স্নিপেট অন্তর্ভুক্ত করুন এবং পার্থক্যগুলি ভালভাবে ব্যাখ্যা করুন।

কোন ভাল ব্যবহার বা উপায় হিসাবে কোন মতামত দয়া করে।

অবগতির জন্য। আমি উন্নয়নের জন্য প্ল্যাটফর্মিও ব্যবহার করি এবং সংকলনের সময় পর্দার আড়ালে একটি রূপান্তর প্রক্রিয়াটি আমি লক্ষ্য করি। আমি সেখানে আসলে কী ঘটছে তা বোঝার চেষ্টা করছি, সুতরাং আমি যখন আরডিনোতে কোড করি তখন আমি "খাঁটি" সি ++ সংস্করণটিও বুঝতে পারি।

আমার প্রশ্নের উত্তর আগেই আপনার বিবেচ্য উত্তরের জন্য ধন্যবাদ।


আপনি কি gccআপনার ডেস্কটপে বিশেষত জিজ্ঞাসা করছেন , বা এভিআর সংকলকটির জন্য জিসিসি avr-gcc? একটি .inoএবং একটি .cppফাইলের মধ্যে অনেক বড় পার্থক্য আছে ।
ব্রেটাম

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

উত্তর:


14

আমার উত্তরটি এখানে দেখুন: শ্রেণি এবং অবজেক্টস: আসলে আমার কতগুলি এবং কোন ফাইল টাইপগুলি ব্যবহার করা দরকার? - বিশেষত: আইডিই কীভাবে জিনিসগুলিকে সংগঠিত করে

আমি জানি যে কমপক্ষে আপনাকে আরডুইনো হেডার ফাইলটি অন্তর্ভুক্ত করতে হবে

হ্যাঁ আপনার এটি করা দরকার।

তবে এর বাইরে, .ino থেকে .cpp ফাইল ব্যবহার করে, উদাহরণস্বরূপ জিসিসি-এভিআর বলুন, সংকলন করলে কি সংকলনের ত্রুটি ঘটবে।

আইডিই আপনার জন্য ফাংশন প্রোটোটাইপগুলি উত্পন্ন করে। .Ino ফাইলে কোডের প্রয়োজন হতে পারে বা নাও লাগতে পারে (লেখক যদি স্বাভাবিক সি ++ উপায়ে কোড করার জন্য যথেষ্ট শৃঙ্খলাবদ্ধ না হন এবং সেগুলি নিজেই না করেন তবে সম্ভবত এটি ঘটবে)।


যদি "স্কেচ" এ অন্য ফাইল রয়েছে (যেমন।।।।।।।।।। সি। বা। সিপিপি ফাইল) তবে উপরের উল্লিখিত আমার উত্তরে বর্ণিত হিসাবে এগুলি সংকলন প্রক্রিয়ায় অন্তর্ভুক্ত করা দরকার।

এছাড়াও স্কেচ দ্বারা ব্যবহৃত যে কোনও লাইব্রেরীতে আপনার লিঙ্ক (সংকলন এবং) করতে হবে।


আপনি বিষয়গুলির লিঙ্কিংয়ের দিক সম্পর্কে জিজ্ঞাসা করেননি, তবে প্রাকৃতিকভাবে সংকলিত হিসাবে বিভিন্ন ফাইলগুলি একত্রে লিঙ্ক করা দরকার এবং তারপরে আপলোডের উদ্দেশ্যে একটি। Bel এবং .hex ফাইলে রূপান্তরিত করা উচিত। নিচে দেখ.


উদাহরণ মেকফিল

আইডিই আউটপুট এর উপর ভিত্তি করে কিছুক্ষণ আগে আমি একটি সাধারণ মেকফিল তৈরি করেছি :

#
# Simple Arduino Makefile
#
# Author: Nick Gammon
# Date: 18th March 2015

# where you installed the Arduino app
ARDUINO_DIR = C:/Documents and Settings/Nick/Desktop/arduino-1.0.6/

# various programs
CC = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-gcc"
CPP = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-g++"
AR = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-ar"
OBJ_COPY = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-objcopy"

MAIN_SKETCH = Blink.cpp

# compile flags for g++ and gcc

# may need to change these
F_CPU = 16000000
MCU = atmega328p

# compile flags
GENERAL_FLAGS = -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(F_CPU)L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106
CPP_FLAGS = $(GENERAL_FLAGS) -fno-exceptions
CC_FLAGS  = $(GENERAL_FLAGS)

# location of include files
INCLUDE_FILES = "-I$(ARDUINO_DIR)hardware/arduino/cores/arduino" "-I$(ARDUINO_DIR)hardware/arduino/variants/standard"

# library sources
LIBRARY_DIR = "$(ARDUINO_DIR)hardware/arduino/cores/arduino/"

build:

    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(MAIN_SKETCH) -o $(MAIN_SKETCH).o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/malloc.c -o malloc.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/realloc.c -o realloc.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WInterrupts.c -o WInterrupts.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring.c -o wiring.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_analog.c -o wiring_analog.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_digital.c -o wiring_digital.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_pulse.c -o wiring_pulse.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_shift.c -o wiring_shift.c.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)CDC.cpp -o CDC.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial.cpp -o HardwareSerial.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HID.cpp -o HID.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)IPAddress.cpp -o IPAddress.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)main.cpp -o main.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)new.cpp -o new.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Print.cpp -o Print.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Stream.cpp -o Stream.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Tone.cpp -o Tone.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)USBCore.cpp -o USBCore.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WMath.cpp -o WMath.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WString.cpp -o WString.cpp.o 
    rm core.a
    $(AR) rcs core.a malloc.c.o 
    $(AR) rcs core.a realloc.c.o 
    $(AR) rcs core.a WInterrupts.c.o 
    $(AR) rcs core.a wiring.c.o 
    $(AR) rcs core.a wiring_analog.c.o 
    $(AR) rcs core.a wiring_digital.c.o 
    $(AR) rcs core.a wiring_pulse.c.o 
    $(AR) rcs core.a wiring_shift.c.o 
    $(AR) rcs core.a CDC.cpp.o 
    $(AR) rcs core.a HardwareSerial.cpp.o 
    $(AR) rcs core.a HID.cpp.o 
    $(AR) rcs core.a IPAddress.cpp.o 
    $(AR) rcs core.a main.cpp.o 
    $(AR) rcs core.a new.cpp.o 
    $(AR) rcs core.a Print.cpp.o 
    $(AR) rcs core.a Stream.cpp.o 
    $(AR) rcs core.a Tone.cpp.o 
    $(AR) rcs core.a USBCore.cpp.o 
    $(AR) rcs core.a WMath.cpp.o 
    $(AR) rcs core.a WString.cpp.o 
    $(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(MAIN_SKETCH).elf $(MAIN_SKETCH).o core.a -lm 
    $(OBJ_COPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $(MAIN_SKETCH).elf $(MAIN_SKETCH).eep 
    $(OBJ_COPY) -O ihex -R .eeprom $(MAIN_SKETCH).elf $(MAIN_SKETCH).hex 

সেই বিশেষ ক্ষেত্রে, .ino ফাইলটি কোনও সমস্যা ছাড়াই সঙ্কলিত করে ব্লিঙ্কসিপি-র নাম পরিবর্তন করে এই লাইনটি যুক্ত করার পরে :

#include <Arduino.h>

আপনার নিকটকে সংক্ষিপ্ত উত্তরের জন্য ধন্যবাদ জানাই, আপনি যে স্তরের কাছাকাছি রয়েছেন আমি তার কোথাও নেই, এবং একটি মেক ফাইল সম্পর্কেও ভাবি নি। সুতরাং মূলত বাক্য গঠনটিও সেখানে একই রকম, এটি কেবলমাত্র বস্তুর সংযোগ সম্পর্কে, ডান? আমার বিছিন্ন করার জন্য আপনার মেক ফাইলটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ। আমি নিশ্চিত যে এর থেকে আরও প্রশ্ন উঠবে! আবার ধন্যবাদ!
রেডডগআল্ফা

উপরের আমার ফাইলটি পোস্ট করার সময় এটি কাজ করেছিল, তবে আমি বিশ্বাস করি পরবর্তী আইডিইগুলির জন্য টুইঙ্কের প্রয়োজন হতে পারে (কারণ তারা গ্রন্থাগারের ফাইলগুলি ঘুরে বা নাম পরিবর্তন করে) name তবুও, একটি ভার্বোস সংকলন করা আইডিই বর্তমানে কী উত্পন্ন করছে তা দেখায়, যা আপনাকে শুরু করা উচিত।
নিক গ্যামন

10

আমি নিক গ্যামনের উত্তরে কয়েকটি পয়েন্ট যুক্ত করতে চাই:

  • এটি একটি সঙ্কলন করার জন্য আপনার একটি .ino ফাইলটির নাম পরিবর্তন করার দরকার নেই: আপনি যদি স্পষ্টভাবে সংকলকটিকে এটি সি ++ (বিকল্প -x c++) বলুন তবে এটি অস্বাভাবিক ফাইলের প্রসারকে উপেক্ষা করবে এবং সি ++ হিসাবে এটি সংকলন করবে।
  • আপনাকে #include <Arduino.h>.ino ফাইলটিতে যুক্ত করার দরকার নেই : আপনি কম্পাইলারকে এটি করতে বলতে পারেন ( -include Arduino.h)।

এই কৌশলগুলি ব্যবহার করে আমি ব্লিংক.ইনোকে কোনও সংশোধন ছাড়াই সংকলন করতে পারি , যথাযথ কমান্ড-লাইন বিকল্পের সাহায্যে অ্যাভার-জি ++ দিয়ে:

avr-g++ -mmcu=atmega328p -DARDUINO=105 -DF_CPU=16000000L \
    -I/usr/share/arduino/hardware/arduino/cores/arduino \
    -I/usr/share/arduino/hardware/arduino/variants/standard \
    -Os -fno-exceptions -ffunction-sections -fdata-sections \
    -Wl,--gc-sections -g -Wall -Wextra \
    -x c++ -include Arduino.h \
    /usr/share/arduino/examples/01.Basics/Blink/Blink.ino \
    -x none /usr/local/lib/arduino/uno/libcore.a -lm \
    -o Blink.elf

উপরের কমান্ড লাইনের কয়েকটি নোট:

  • /usr/local/lib/arduino/uno/libcore.aআমি এখানে সংকলিত আরডুইনো কোর সংরক্ষণ করেছি। আমি একই জিনিস বার বার সংশোধন ঘৃণা করি।
  • -x noneফাইল এক্সটেনশানগুলি মনে করার জন্য সংকলকটি বলার প্রয়োজন। এটি ছাড়াই, এটি libcore.a ধরে নিতে পারে a একটি সি ++ ফাইল।

আমি সেই কৌশলগুলি সুদার মুথুর আরডিনো-মেকফিল থেকে শিখেছি । এটি একটি খুব সাধারণ মেকফিল যা অনেকগুলি বোর্ড এবং লাইব্রেরি সহ কাজ করে। আরডুইনো আইডিইর সাথে সম্পর্কিত একমাত্র জিনিসটি হ'ল ফরোয়ার্ড ঘোষণা।


খুব সুন্দর, এডগার! আমার সমাধান মূলত আইডিই যা করে তা নকল করে, আপনার প্রকৃত সমস্যাটি আরও নিকৃষ্টতরভাবে সমাধান করতে পারে। অবশ্যই আপনাকে libcore.aফাইলটি আগেই তৈরি করতে হবে। আমি অনুমান করি যে আমার উত্তরে যে লাইনগুলি নির্মাণ core.aকরা হয়েছে তা আগেই করা যেতে পারে, তাই তাদের প্রতিটি বিল্ডের অংশ হতে হবে না। অভিজ্ঞতা দেখিয়েছে যে আরও জটিল স্কেচগুলিতে (যেমন: ওয়্যার বা এসপিআই ব্যবহার করে) আরও বেশি ফাইল যুক্ত হতে হবে core.a
নিক গ্যামন

@ নিকগ্যামন: এটা ঠিক, মুঠুর মেকফাইল (এবং আমি ধরে নিলাম, আরডুইনো আইডিই) আপনি লাইব্রোর.এ-তে যে কোনও লাইব্রেরি ব্যবহার করবেন। আমি এই পদ্ধতিকে সত্যই পছন্দ করি না, কারণ এটি আপনার দ্বারা সংকলিত নির্দিষ্ট প্রোগ্রামের উপর নির্ভর করে "মূল গ্রন্থাগার" নির্ভর করে। ওয়্যার বা এসপিআই এর মতো একক-ফাইল লাইব্রেরির জন্য, আমি কেবল লাইব্রেরির সি ++ ফাইলটিকে মূল প্রোগ্রাম হিসাবে একই সংকলন কমান্ডে রাখতে পছন্দ করি। এই কমান্ড লাইনটি বেশ সহজেই দীর্ঘ হয়ে যায়, তাই আমি একটি মেকফাইল ব্যবহার করি।
এডগার বোনেট

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