73224
ESP32用のプログラムを作っているのですが、ある関数を組み込むとフルビルドが通らないため、フルビルドになるときはマクロで一度その関数をビルドしないようにしてから再度ビルドし直すというようなことをしています。

面倒なのでこの様な方法はとらずに一度で全部終わらせたいのですが、何かわからないでしょうか。

どの関数が、というところまではわかったのですが

  1. クラス内のメンバ関数をイベント受け取り用のコールバック関数にしようとして出来なかったので
  2. 通常の関数でラップしたラップ関数を作り、そのラップ関数の中でそのクラスのメンバ関数をコールする

ということをしているだけなのですが・・・

そのためフルビルドするときは以下の手順で実施しています。

  1. `#define BUILD_ALL` をコメントにしてフルビルド
  2. 上記のコメントを外してビルド

現象としては [こちらの](https://community.platformio.org/t/archiving-problem-
libframeworkarduino-a/13959/7) 現象と同じような感じで、ビルドの最後の直前の
**libFrameworkArduino.a** でずっと固まったままになります。

コンパイラは `xtensa-esp32-elf-gcc.exe`を使われています。

オプションについては以下の内容が使用されていました。`-Wno-unknown-pragmas` はこちらで教えていただいたオプションを入れたものです。

```

    "intelliSenseMode": "clang-x64",
    "cStandard": "c99",
    "cppStandard": "c++11",
    "compilerPath": "C:/Users/chiro/.platformio/packages/toolchain-xtensa32@2.50200.80/bin/xtensa-esp32-elf-gcc.exe",
    "compilerArgs": [
        "-mlongcalls",
        "-Wno-unknown-pragmas",
        ""
    
```

* * *

### 関連するソースコード

main.cppの該当箇所

```

    static OtherClass obj1;
    static EventPutClass obj2;
    
    void setup()
    {
    ...
    #ifdef  BUILD_ALL
        SetOtherClass(obj1);
        obj2->SetCallBack(SetWrapper);
        //! @todo   ここにコールバックを延々と登録していく
    #endif
    ...
    }
    
```

ヘッダ

```

    #pragma once
    
    #include "./def/defA.h"
    #include "./XXXX/YYYY.h"
    
    //★★★★フルビルドの時は一度コメントにしてフルビルドを通してから、コメントを外して再度ビルド
    //#define   BUILD_ALL   //!<    ビルドが通らないときは、この定数を一度コメントにする
    //★★★★main.cppにもBUILD_ALLで該当箇所をifdefで囲っておくこと
    
    #ifdef BUILD_ALL
    
    void SetOtherClass(OtherClass *cObj);
    void SetWrapper(ushort usStat);
    
    #endif
    
```

関数群のあるソース

```

    #include <Arduino.h>
    #include "header.h"
    
    #ifdef BUILD_ALL
    static OtherClass *_cObj;           
    
    void SetOtherClass(OtherClass *cObj)
    {
        _cObj = cObj;
    }
    //!<    @name ラッパ関数群
    //!<    @details    本当はクラスのメンバ関数をコールバックにしたかったが、C++の仕様上出来ないので通常の関数でラップする
    //  @{
    /**
     * @brief OrderFunctionをラップする関数
     * 
     * @param usStat    
     */
    void SetWrapper(ushort usStat)
    {
        Serial.printf("ラップ関数[%d]\n",usStat);
        _cObj->OrderFunction(usStat);//★この関数をラップしてるだけ
    }
    
    /// @}
    
```
CC BY-SA 4.0
2020-08-16T04:55:36.900
69594
2021-01-12T01:04:37.717
2021-01-12T01:04:37.717
3060
10098
question
c++ vscode esp32
ESP32用のプログラム(VS Code上のPaltformIO)で、フルビルドにするとビルドが通らない
コンパイル時のメッセージにソースコードにS-JISを使っていないのに以下のようなエラーが表示されていたので、

```

    UnicodeDecodeError: 'cp932' codec can't decode byte 0x87 in position 999: illegal multibyte sequence
    
```

検索しまくっていたら、上記の途中でビルドが止まる現象が解決しました。  
以下のページを参考に解決しました。

[PlatfprmIOで UnicodeDecodeError: 'cp932'
](http://toru777.blogspot.com/2019/10/platfprmio-unicodedecodeerror-
cp932.html)

多分これ、報告しないとまたあとから問題が出るような気がするのですが、何処に報告するのが正しいでしょうか。
CC BY-SA 4.0
2021-01-11T15:41:28.333
73224
2021-01-12T00:36:56.927
2021-01-12T00:36:56.927
3060
10098
69594
answer