Rokiのチラ裏

学生による学習のログ

Xcode8.0 deprecatedのEndless stream of warnings

Xcode8.0にアップデートしてからGCC6.1.0でコンパイルを行うと、どうも下記のような警告文が大量に出力されるようになった。

warning: section "__textcoal_nt" is deprecated
        .section __TEXT, __textcoal_nt, coalesced, pure_instructions
                 ^      ~~~~~~~~~~~~~~
note: change section name to "__text"
        .section __TEXT, __textcoal_nt, coalesced, pure_instructions
                 ^      ~~~~~~~~~~~~~~
warning: section "__const_coal" is deprecated
        .section __TEXT, __const_coal, coalesced
                 ^      ~~~~~~~~~~~~~
note: change section name to "__const"
        .section __TEXT, __const_coal, coalesced
                 ^      ~~~~~~~~~~~~~

これは既にBugzillaで報告されており、問題に該当するセクション名を改名するパッチが置かれている。

私の環境では解決しなかったが、パッチ適応の他に、active developer directoryなるもののパスを変更する事で解決している例もあるようだ。

sudo xcode-select -s /Library/Developer/CommandLineTools

しかしこれは根本的な解決にはなっていないように思う。
因みに、上記のコマンドを適用すると、Xcode付属のdiff的なツールである、FileMergeを実行できなくなるという。(エラーメッセージすら出力しないとのこと)
そういった場合は、再びXcode8.0へ切り変える必要がある。

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/

上記の二つの方法でも解決しない場合、もはや一度Xcodeとそのコマンドラインツールをシステムから丸ごと削除して、Xcode 7.x代のcommand line toolや諸々を導入した方が早いだろう。
該当セクション名の生成を辞めるといった動きは約一年程前からあったようだが、こんな事に時間を浪費したくはないものである。

追記

最近話題になっているXamarinを導入してみようと試みると、やはりXCodeの最新版が必要になってしまったのでダウングレード以外の方法を試みたのだが...

残念な事に、執筆時、未だにこの問題における公式のパッチ等はない。こんな事に時間もかけられないので、取り敢えずかなり無理矢理だが応急処置的なスクリプトを書いた。

#!/bin/zsh

/usr/local/gcc-6.1.0/bin/g++ $1 -Wall -std=c++1z -I ~/Documents/src/cpp/IncludeLibraries |& sed "/^\\/var\\/folders\\/48/d" | sed "/.section __TEXT/d" | sed "/~~~~~~~~~~~~~/d"

出力内容を直で指定してsedで削除しているだけだ。しかしこのスクリプトでは、文字列”~~~~~~~~~~~~~”が見つかった途端にその警告文/エラー文を削除してしまうのであまり良いとも思えない。これ以外でとても単純な解決法は、clangを使う事である。しかし、clangでは実験的な実装(experimental)がないため、それに依存したサンプルコードなどが動かない。experimentalな実装を用いる場合のみgccを使うというのが、一番良いと思われるのだが、その部分を使い手側が意識しなければならないのは、あまり良い気持ちではない。

参照