Oke, kita semua telah melihat pertanyaan-pertanyaan itu di seluruh web seperti Arduino vs C ++, atau pertanyaan serupa lainnya. Dan sebagian besar jawaban bahkan tidak menyentuh perbedaan kompilasi selain melalui informasi abstrak.
Pertanyaan saya bertujuan untuk menyelesaikan perbedaan yang sebenarnya (bukan preferensi) dalam bagaimana file .ino diubah namanya menjadi file .cpp atau ekstensi file serupa lainnya untuk c ++ akan dikompilasi menggunakan GCC-AVR. Saya tahu bahwa minimal Anda harus memasukkan file header Arduino, tetapi lebih dari itu, apa yang akan menyebabkan kesalahan kompilasi jika kompilasi kata .ino ke file .cpp menggunakan, katakanlah, misalnya GCC-AVR. Demi kesederhanaan, mari gunakan contoh blink klasik untuk menjelaskan apa perbedaannya. Atau jika Anda memiliki snipet kode yang lebih baik untuk digunakan, harap dengan segala cara, sertakan snippet dalam jawaban Anda dan jelaskan perbedaannya secara menyeluruh.
Harap tidak ada pendapat yang merupakan cara atau alat yang lebih baik untuk digunakan.
FYI. Saya menggunakan Platformio untuk pengembangan dan saya perhatikan proses konversi terjadi di belakang layar selama kompilasi. Saya mencoba memahami apa yang sebenarnya terjadi di sana, jadi ketika saya kode di Arduino, saya memahami versi C ++ yang "murni" juga.
Terima kasih atas jawaban Anda yang bijaksana atas pertanyaan saya sebelumnya.
sumber
gcc
di desktop Anda, atau GCC untuk kompiler AVRavr-gcc
? ada perbedaan yang jauh lebih besar daripada ada di antara file.ino
dan a.cpp
.Jawaban:
Lihat jawaban saya di sini: Kelas dan objek: berapa banyak dan jenis file apa yang sebenarnya saya perlukan untuk menggunakannya? - khusus: Bagaimana IDE mengatur berbagai hal .
Ya, Anda harus melakukan itu.
IDE menghasilkan prototipe fungsi untuk Anda. Kode dalam file .ino mungkin atau mungkin tidak memerlukan ini (mungkin akan kecuali jika penulis cukup disiplin untuk kode dalam cara C ++ biasa dan melakukannya sendiri).
Jika "sketsa" berisi file lain (mis. File .ino, .c atau .cpp lainnya) maka ini harus dimasukkan dalam proses kompilasi seperti yang saya jelaskan dalam jawaban saya yang disebutkan di atas.
Anda juga perlu (kompilasi dan) tautan di perpustakaan apa pun yang digunakan oleh sketsa.
Anda belum bertanya tentang sisi tautan dari berbagai hal, tetapi secara alami berbagai file, seperti yang dikompilasi, perlu dihubungkan bersama, dan kemudian diubah menjadi file .elf dan .hex untuk keperluan pengunggahan. Lihat di bawah.
Contoh makefile
Berdasarkan output IDE saya membuat makefile sederhana beberapa waktu lalu :
Dalam kasus tertentu, file .ino dikompilasi tanpa masalah setelah mengubah nama menjadi Blink.cpp dan menambahkan baris ini:
sumber
Saya hanya ingin menambahkan beberapa poin pada jawaban Nick Gammon:
-x c++
), itu akan mengabaikan ekstensi file yang tidak biasa dan mengkompilasinya sebagai C ++.#include <Arduino.h>
file .ino: Anda dapat memberi tahu kompiler untuk melakukannya untuk Anda (-include Arduino.h
).Dengan menggunakan trik itu, saya dapat mengkompilasi Blink.ino tanpa modifikasi , hanya dengan menggunakan avr-g ++ dengan opsi baris perintah yang tepat:
Beberapa catatan pada baris perintah di atas:
/usr/local/lib/arduino/uno/libcore.a
adalah tempat saya menyimpan inti Arduino yang dikompilasi. Aku benci kompilasi berulang-ulang hal yang sama.-x none
diperlukan untuk memberitahu kompiler untuk mengingat ekstensi file lagi. Tanpa itu, itu akan menganggap libcore.a adalah file C ++.Saya belajar trik-trik itu dari Arduino-Makefile milik Sudar Muthu . Ini adalah Makefile yang sangat umum yang bekerja dengan banyak papan dan dengan perpustakaan. Satu-satunya hal yang hilang relatif terhadap Arduino IDE adalah deklarasi maju.
sumber
libcore.a
file terlebih dahulu. Saya mengira bahwa garis-garis dalam jawaban saya yang membanguncore.a
dapat dilakukan sebelumnya, sehingga mereka tidak harus menjadi bagian dari masing-masing membangun. Pengalaman menunjukkan bahwa sketsa yang lebih kompleks (mis. Menggunakan Wire atau SPI) membutuhkan lebih banyak file untuk ditambahkancore.a
.