2016/07/23

[esp8266]mbedTLSサンプルのコンパイルが通らない (2)

順番に確認しよう。


__GNUC_PREREQ (3, 2)

これでエラーが出ているのは、__GNUC_PREREQ()というマクロがないからだろう。
cygwinのgccが5.4.0だったので、コンパイルしてみる。

#include <stdio.h>

int main(int argc, char *argv[])
{
#if __GNUC_PREREQ(5, 5)
    printf("prereq\n");
#else
    printf("??\n");
#endif

    return 0;
}

通って、elseルートを通った。
(5, 4)にするとifルートを通るので、majorとminorが指定したバージョン以上であれば真になるマクロのようだ。

/* Macro to test version of GCC.  Returns 0 for non-GCC or too old GCC. */
#ifndef __GNUC_PREREQ
# if defined __GNUC__ && defined __GNUC_MINOR__
#  define __GNUC_PREREQ(maj, min) \
    ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
# else
#  define __GNUC_PREREQ(maj, min) 0
# endif
#endif /* __GNUC_PREREQ */

xtensa-lx106-elf-gccのバージョンは、4.8.3。
-cでビルドだけさせようとしたが、やはりコンパイルエラーになった。
「__」を外しても同じ。
試しに、同じ名前のマクロを定義してみたが、warningも出なかった。
本当にないんだ。。。

cygwinで同じことをさせてみると、/usr/include/sys/features.hにマクロ定義があるようだった。
ESP8266用のVMでgccコンパイルさせると、/usr/include/features.hに定義があることがわかった。
が、これはgccだからだよな。。。。

 

あ、/opt/xtensa-lx106-elf/xtensa-lx106-elf/include/sys/features.hがあった。
この中には__GNUC_PREREQ()がいる。
じゃあincludeさせてみればよいかと思ったが、やっても同じだ。

なんだ?


<sys/features.h>と書いてエラーにならなかったから、少なくともそういう名前のファイルは読み込めているのだと思う。
だからあり得るのは、

  • 検索パスで先に別のファイル名が引っかかっている
  • includeガードで同じ名前を使っているものがいて、ガードされている

のどちらかだろう。

後者の方が簡単に調べられるので、#ifdefでやってみたが、定義されていなかった。
そして、<sys/features.h>をincludeすると、定義されているようになった。
じゃあ、ガードされているわけではないようだ。

features.hの中身をコピペしたファイルをdemoのフォルダに置いてincludeさせてみた。
それだとうまくいく。
じゃあ、読んでいるファイルが違うだけ、ということか?

echo | xtensa-lx106-elf-cpp -Wp,-v > paths.txt 2>&1

こんな感じで検索パスを取ってくる。

#include <...> search starts here:
/opt/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/include
/opt/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/include-fixed
/opt/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/include
/opt/xtensa-lx106-elf/bin/../xtensa-lx106-elf/sysroot/usr/include
End of search list.

見ているパスと違うな。。。
xtensa-lx106-elfのincludeじゃなくて、lib/gccのずっと下にあるincludeだ。
こっちのfeatures.hには__GNUC_PREREQ()がいない!!

そういうことか・・・。


面倒なことに、エラーを出しているstdint.hはinclude_nextを使っていて、それが私が見ていたパスになるのだ。
だから、features.hもinclude_nextでやってやりたいところなのだが。。。

 

ああ!
リンク先のCompiler_Update_20150727.zipの方はlib/gccの下にあるincludeにはsysフォルダ自体がない!
https://drive.google.com/drive/u/0/folders/0B5bwBE9A5dBXaExvdDExVFNrUXM

じゃあ、こっちを使えば自動的にsys/features.hは自動的に期待している方のファイルを見に行くということか。。。

 

VMで提供されているコンパイラは/optに置いていたが、新しい方は自分のところで使うことを想定しているようだ。
書いてあるように、/optにある方を削除して、~/にbz2を展開して、.bashrcにパスを追加して、sourceなどで読み直す。

mbedtls_demoに移動して、make clobberで消して、./gen_misc.shでビルド。。。
ああ、ビルドが通りました。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。