2019年3月1日金曜日

C++11のコンパイルのための環境確認

今回、久々にC++を書いてみたくなり、改めて勉強してみた。

その際、そのときどうやらC++11のコードで書いてしまっていたようで、警告がでてしまった。

現在の環境確認の確認なども行なったのでそれのメモ。

今回コンパイルするコード

今回は以下のコードをコンパイルすることにする。ファイル名はstudy.cppとする。
## 以下のコードをテキストエディタやAtom、Vimなど適当なテキストエディタに書いて、ファイル名をstudy.cppにして保存。
#include<iostream>

using namespace std;

int main(){
  auto ch = "x";            #ここの部分がC++11のコード
  cout << "success \n";
  return 0;
}

環境の確認

最近になって、コンパイラが云々という細かい話が少しわかってきた。 とりあえず、ネットなどでよくみたりして自分が知っているコンパイラが、gcc、g++、c++ ,clang、clang++なので、それのバージョンなどを調べてみた。 といった矢先、まずそれぞれ実行コマンドがどこにあるのか調べてみることにした。

whichコマンド(その1)

whichコマンドで、実行コマンドがどこのディレクトリにあるのか確認できるらしい。 特に、オプションとして-aをつけて実行すると、環境変数PATHに登録されている中から全て検索するらしい。 whichを実行した結果がこれ。
  • gcc
  • $which -a gcc     #ターミナルを開いて、カレントディレクトリがどこでもいいので、左記を打って実行。
    /usr/bin/gcc      #実行結果
    
  • g++
  • $ which -a g++
    /usr/bin/g++
    
  • c++
  • $ which -a c++
    /usr/bin/c++       
    
  • clang
  • $ which -a clang
    #二つありますよ、という意味で2行出てくる。
    /Users/hiroshi/.pyenv/shims/clang
    /usr/bin/clang       #これがXcode付属のコンパイラ
    
  • clang
  • $ which -a clang++
    #二つありますよ、という意味で2行出てくる。
    /Users/hiroshi/.pyenv/shims/clang++
    /usr/bin/clang++    #これがXcode付属のコンパイラ
    
上記にもコメントをしているように、/usr/binにあるのがXcodeの付属のコンパイラらしい。

whichコマンド(その2)

上記のwhich -a コマンドで二つあるものがあったが、それでは実際にはどっちが実行されるのかというのはwhichでしらべる。
  • clang
  • $ which clang
    /Users/hiroshi/.pyenv/shims/clang
    
  • clang++
  • $ which clang++
    /Users/hiroshi/.pyenv/shims/clang++
これらは、環境変数PATH、つまり
$ echo $PATH
/Users/hiroshi/.pyenv/shims:/Users/hiroshi/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin
において、より左側に書かれているディレクトリから探索していって、より早く見つかる実行ファイルが実行されている。

バージョンの確認

上記で確認した、gcc、g++、c++、clang、clang++全てについてバージョンを確認しようと思ったが、clangとclang++以外はよくわからなかったのでその二つについて書く。 それ以外はわかり次第、追い追いかくかも。 なにも指定せず、以下のようにclang -vのように打った場合には、環境変数PATHに置いてより左側にある実行ファイルのバージョンが確認できる。
$clang -v
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Users/hiroshi/.pyenv/versions/anaconda3-4.3.0/bin
$ clang++ -v
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Users/hiroshi/.pyenv/versions/anaconda3-4.3.0/bin
環境変数とか関係なしに、特定の実行ファイルのバージョンを調べたい場合は、絶対パスで書いてしまう。
$ /usr/bin/clang -v
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ /usr/bin/clang++ -v
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Xcode付属のclang、clang++については、これだけでは明確にわからない気がしたが、どうやら少なくとも10以上の様子。
( cf:Xcode --wikipedeia )

オプションの指定

さて、Xcode付属のclangやclang++であれば、C++11に対応しているはずなので、以下のように実行してみるがエラーになってしまう。
$/usr/bin/clang++ study.cpp
study.cpp:6:3: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
  auto ch = "x";
  ^
1 warning generated.

(もしくは)
$/usr/bin/clang study.cpp
→たくさんエラーが掃き出されるので省略。
調べてみたところ、自分の理解力では明確な理由はわからないが、以下のようにオプションをつけて実行すればコンパイルできるらしい。
$ /usr/bin/clang++ -std=c++11 study.cpp
hiroshi-no-MacBook-Air:3-C:C++ hiroshi$
生成された実行ファイルを実行するために、./a.outと打てば、以下のようになり成功したことがわかる。
./a.out
success
当然clangのほうではできない。理由については自信がない。

これらのコマンド群はシェルでつくってしまってもいいかもしれない。そのあたりのことはまた別の機会に。

0 件のコメント:

コメントを投稿