問題タブ [lto]
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++ - 静的ライブラリのクロス TU 最適化
通常、リンク時の最適化は、実際のマシン コードではなくオブジェクト ファイルに IR を挿入することによって実装されます。したがって、静的ライブラリを扱う場合、それはそのような IR ファイルの単なるコレクションであり、それを使用するコードが変更されるたびに LTO を実行する必要があります。代わりに共有ライブラリをビルドすると、LTO は 1 回だけ実行され、dll 内のコードは完全に最適化されます。
静的ライブラリを扱うときに、翻訳単位全体でいくつかの最適化を行うことも可能ですか? プログラム全体の仮定を行うことができないため、同じではないことはわかっていますが、ヘッダーで定義されていないセッター/ゲッターをインライン化するなど、いくつかの基本的なことを実行できるはずではありませんか?
gcc - -fno-short-enums を無視する GCC (Sourcery codebench 2013.11) リンク時の最適化
簡単なソース ファイルが 2 つある
obj1.cc:
obj2.cc:
Sourcery codebench lite 2013.11 を使用しています。
を使用して各ソースファイルをコンパイルします
-flto なしでそれらをリンクすると、リンク時の最適化が呼び出されず、int サイズの列挙型を持つとマークされたオブジェクト ファイルが取得されます。
しかし、単純に-flto
リンカーの呼び出しに追加すると、出力には小さな列挙型があると主張されます。
でリンク ステップを実行すると-v
、gcc が lto ステージに到達したときに次のように表示されます。
LTOステップ中に何かが取り除か-fno-short-enums
れたように見えます。COLLECT_GCC_OPTIONS
これは一般的な gcc の問題であり、Sourcery ビルドに限定されないのではないかと思います。
これはgccのバグですか?32ビット列挙型で構築された特定のライブラリにリンクするために、短い列挙型なしでオブジェクトファイルを生成するにはgccが必要です。ソースから gcc を再構築せずにこの目標を達成する方法はありますか?
更新: arm-none-eabi-gcc 4.8.2-14ubuntu1+6toolchain ( http://packages.ubuntu.com/trusty/devel/gcc-arm-none-eabi ) を使用して、Ubuntu 14.04 でまったく同じ動作を確認しました。)
webrtc - LTO なしで Chromium、WebRTC をビルドする
私は Arch Linux x86_64 を使用しており、WebRTC ライブラリを構築しようとしています。次のようにすると、コンパイル エラーが発生します。
リンク時の最適化に問題があるようです。ただし、LTO を有効にせずに WebRTC を構築する方法がわかりません。失敗したコマンドを手動で実行して追加すると-fno-lto
、正常にリンクされます。gyp
すべてに適用されるように、構成内のコンパイラ/リンカー フラグを追加または変更するにはどうすればよいですか?
c++ - マルチスレッド サポートと競合するリンク時の最適化
で改善されたリンク時間最適化サポートについて読んだg++-4.9
ので、試してみたいと思います。悲しいことに、実行時に例外が発生しますstd::system_error
。特にe.what() == Enable multithreading to use std::thread: Operation not permitted
.
これで、通常、そのエラーを修正する方法がわかりまし-pthread
た。コンパイラの呼び出しに追加しますが、実際には、このパラメーターが既にあります。
私のサンプルコードは次のとおりです。
コンパイル済み (X は 7、8、または 9)
期待どおりに問題なく動作し、実行時エラーはありません。
でも、
例外で失敗しsystem_error
ます。
質問:
この動作は意図されたものですか (修正は何ですか?)、それともバグですか?
(この質問が出る前に: 私のコンパイラはすべて でビルドされています--enable-threads=posix
)
c - gcc LTO - 共有ライブラリ - そうですか?
環境 :
lto (リンク時コンパイル) の仕組みを理解しようとしている
コード:
私はそれらのファイルを持っています:
ジュリア.h:
julia.c :
次のように共有ライブラリとしてコンパイルされます: gcc -O3 -fPIC -shared julia.c -o libjulia.so -L$PWD -I$PWD -flto
そして私のメインプログラム:
main.c
コンパイル: gcc -O3 main.c -I/path/to/inc -L/path/to/lib -Wl,-rpath=/path/to/lib -ljulia -flto
それは罰金をコンパイルします。
質問 :
では、これは hello world プログラムですが、LTO を正しく使用していますか? リンケージを最適化するのに必要なのはそれだけですか?
ありがとう
c++ - 静的ライブラリで lto を使用するにはどうすればよいですか?
で静的ライブラリを構築しようとすると-flto
、未定義の参照エラーが発生します。
ライブラリ.cpp :
main.cpp :
コンパイル出力:
library.o
の代わりにとリンクすると問題なく動作しlibrary.a
ます。私は何が欠けていますか?これは、GCC 4.9.1 および binutils 2.24 で発生します。
c++ - 置き換えられた演算子 new を使用した Clang リンク時の最適化により、valgrind で free()/delete の不一致が発生する
-flto を指定して clang 3.5.0 を使用し、共有ライブラリとリンクする場合、共有ライブラリ内の への呼び出しは、メイン オブジェクトからのoperator delete
への呼び出しと同じシンボル解決順序に従わないようです。operator new
例:
共有.cpp :
main.cpp :
これをビルドして valgrind で実行すると、次のようになります。
valgrind の を見つけていることがわかりますが、 fromoperator delete
を使用しています。対照的に、gcc を使用したまったく同じビルド (を に置き換えるだけ) は正常に動作します。理由、またはそれを回避する方法はありますか?operator new
main.cpp
clang++
g++
編集: @Deduplicator の要求に応じて、シンボルのインポートとエクスポート。