close

前言

使用 VS Code + PIO 之後,將舊的程式或一些範例程式複製到 main.cpp 之後,

遇到的第一個問題就是編譯失敗。 出現如下 was not declared in this scope 錯誤

src\main.cpp:行數:位置: error: '函數名稱' was not declared in this scope

但是如果把 void dly100() 這個函數放到呼叫之前就正常了,這是因為 C++的標準,使用前都要先做【宣告】

解決方法可以

  1.  loop()擺到 dly100() 之後 
  2. dly100() 擺到 loop() 之前
  3. 在 loop()之前增加  void dly100(); 宣告
  4. 將附檔名改成 ino

為何會有此差異,大家可以先試著先採用 4 的方式進行編譯,並注意觀察 src 目錄的變化,

會發現該目錄編譯過程會產生一個 main.ino.cpp ,但是編譯完成後就會被刪除,

大家可以試著編譯過程將該檔案給複製出來查看內榮,會發現 ino 會被先經過一層處理產生 cpp 之後再進行編譯

而該 cpp 與 ino 的差異就在於多了上述解決方案 3 的宣告。

所以遇到該問題最簡單的方式 就是將 cpp 改成 ino ,就可以簡單解決該問題。

若想更了解 ino 與 cpp 之差異

 

參考以下文章
http://www.visualmicro.com/page/User-Guide.aspx?doc=INOs-and-CPPs.html

簡單來說就是..

  1. 如果你專案下有多個 ino  檔,會自動先被整理成一個 cpp 檔,然後在進行編譯
  2. 如果有多個 .cpp 那請你學其他 .cpp 先做一個 .h  並加上一些定義
    #ifndef dly3_h
    #define dly3_h
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #include <Arduino.h>
    void dly3();
    
    #ifdef __cplusplus
    } // extern "C"
    #endif
  3. 請不要同時使用 main.cpp 及  main.ino ,沒意義只是讓自己容易造成混亂而已。

PIO 主專案 ino 檔名請務必使用 main ,必須包含 setup() loop() 兩個函式

編譯過程產生 main.ino.cpp 如下圖

dly2() 是 dly.ino 裡面的函數 ,被納進來 main.ino.cpp了。

arrow
arrow
    創作者介紹
    創作者 火焰小賓 的頭像
    火焰小賓

    我的筆記

    火焰小賓 發表在 痞客邦 留言(0) 人氣()