問題タブ [gcc6]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - -O2 なしで gcc が関数のインライン化に失敗する
私は最近、debian テストをアップグレードして gcc 6.2.1 コンパイラを入手した後、コードの一部をコンパイルする際に問題に遭遇しました。私はそれをこの簡単な例に要約しました:
このコードは、次のコードではコンパイルされません。
gcc -o exec code.c # gcc 6.2.1
次のエラーで失敗します。
undefined reference to 'func'
また、同じホストで gcc 4.8、4.9、および 5 を試して失敗しました。追加するとコンパイルされます:
gcc -o exec code.c -O2 # gcc 6.2.1
なぜそれが -O2 フラグで機能するのか、それなしでは機能しないのか、私は本当に興味があります.これは機能すると思いますか?
doxygen - Doxygen 1.8.11 のビルドが gcc620 で失敗する
doxygen に必要なすべてのパッケージとそのバージョンを確認しましたが、gcc620 でのビルドは次のエラーで失敗します。
助けてください。
c++ - gcc で fsanitize スイッチを使用した Boost の問題
C++ コードの特定の領域で発生している問題をデバッグ/診断するために、実行時チェック用のGCC インストルメンテーション オプションの一部を利用しようとしています。
問題を絞り込むために、これらの機能のいくつかを有効にし始めましたが、予期していなかったコードの領域、つまり Boost ライブラリでエラーが発生しました。
gcc スイッチ '-fsanitize=undefined' を使用すると、gdb によって報告される多数の実行時エラーがあることに気付きました。これらのエラーは、ほとんど手間をかけずに再現できるようです。以下にサンプルコードをいくつか用意しました。
環境構成:
- Ubuntu v16.10 (Yakkety) x86_x64
- ブースト v1.61 (apt-get を使用)
- GCC 6.3.0 (最近ソースからビルドされましたが、apt-get のバージョンで問題が発生しました)
- GDB 7.11.90
- CMake v3.7 (cmake Web サイトから)
サンプルコードは次のとおりです。
CMakefile は次のようになります。
GDB サンプル出力:
私の調査結果についていくつか考えた後、いくつかの質問をまとめました。
- これはコーディングエラーですか?
- これはあなたを驚かせますか?
- これらのエラーは誤検知ですか?
- 「-fsanitize」スイッチを使用している人はいますか?
- Boost の新しいバージョン (つまり、ソースからビルドされた v1.63) を試す必要がありますか?
- 自分のシステムに v1.61 と v1.63 の両方をインストールできますか (ただし、リンク先はいずれか 1 つに限られます)?
gcc - gcc -fPIC -fPIE: gcc-4 と gcc-6 の違い
前文: この質問はOracle に関するものではなく、位置独立コードの処理における gcc-4 と gcc-6 の根本的な違いを理解したいと思います。
そこで、Debian stretchで Oracle 12c のインストールを試すことにしました。
gcc-6 とのリンク段階で、次のようなエラー メッセージが発行されます。
ただし、gcc-4.9 を使用するようにコンパイラを切り替えると、すべてのリンクが問題なく行われます。
したがって、私の2つの質問:
- gcc バージョン 4 と 6 の間で -fPIC と -fPIE のデフォルトに変更はありますか? バージョン 6 はデフォルトで 2 つのオプションを使用しているようです。
- 私にとってもっと重要なこと: gcc バージョン 6 には、位置に依存しないコードの生成にバージョン 4 の動作を使用するオプションがありますか? (または、gcc-4 が利用できなくなったため、遅かれ早かれ古いライブラリにリンクできなくなるのでしょうか?)
c++ - g++: 最適化 -march=haswell 以降は数値結果を変更します
選択した最適化に応じて g++ が結果を変えるように見えることに気付いたとき、私はパフォーマンスの最適化に取り組んでおり、もちろん回帰テストを行っています。これまで-O2 -march=[whatever]
のところ、選択したアーキテクチャに関係なく、数値計算でまったく同じ結果が得られるはずだと考えていました。ただし、これは g++ には当てはまらないようです。ivybridge までの古いアーキテクチャを使用すると、どのアーキテクチャに対しても clang と同じ結果が得られますが、haswell 以降の gcc では異なる結果が得られます。これは gcc のバグですか、それとも最適化について何か誤解していましたか? clang がこの動作を示さないように見えるので、私は本当に驚いています。
違いがマシンの精度の範囲内であることは十分に認識していますが、それでも単純な回帰チェックを妨げていることに注意してください。
コード例を次に示します。
以下を使用してコンパイル:
gcc バージョン: 6.2.1
クランバージョン: 3.8.0
64 ビット用にコンパイルされ、Intel Skylake プロセッサで実行されます。