問題タブ [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.
cmake - Clion で LinkTimeOptimization を有効にするにはどうすればよいですか?
プログラムのリンク時間を最適化したいです。有効にするにはどこに入力する必要がありますか?
問題がある場合 (そうでないことを願っています): Windows で MinGW-w64 5.0 を使用しています。
編集:CLionを使用していることが問題にならない理由が本当にわかりません。今のところ、基盤となるビルド システムとして CMake を使用していることは承知しています。
しかし、a) 将来的には、CLion がサポートするビルド システムは CMake だけではなくなるため (ここを参照)、CMake を参照しても問題自体は解決しません。
そして b) CMakeLists.txt を調整するには、各プロジェクトを個別に構成する必要があります。IDE を構成する方法を尋ねたので、それを実行してくれました。
また、それ自体が解決できない問題であるとは考えていません。トリックを行う構成またはプラグインが存在する可能性があります。私はそれを見つけることができませんでした..それでも、それは私の質問が答えられないという意味ではありません.
c - リンケージ警告のデバッグ「シンボルのタイプが元の宣言と一致しません」
次の問題を体系的にデバッグしようとしています。
私はこの模擬テストで、何が問題なのかを正確に知っています -ここでaaaaaaaa
定義されていますが、そこにあります。私の実際の問題では、リンケージは複雑なビルド プロセスの結果である多くのオブジェクトを結合します。どの 2 つのオブジェクトに競合する定義が含まれているかわかりません。int
short
リンクされた各オブジェクト ファイルを調べて、それぞれでシンボルがどのように定義されているかを確認し、定義が一致しないペアを見つけて、この問題に取り組みたいと考えています。次に、ビルド プロセスを追跡して、それらがどのようにビルドされているかを確認し、根本原因を突き止めます。しかし、オブジェクトがどのように定義されているかを確認する方法がわかりません。
nm -A
とを試しobjdump -t
ましたが、シンボルのタイプ/サイズが表示されません:
私のコンパイラ:
c++ - リンク時の最適化を有効にすると、リンカー エラーが発生しますか?
コンパイルとリンクが正常に行われるコードがあります。
現在、リンク時の最適化を有効にしようとしてい-flto
ますが、コンパイラとリンカー フラグに追加すると、リンカー エラーが発生します。
私が追加した唯一のフラグは-flto
.
明確にするために:
-flto
アプリのビルドとリンクがなくても問題ありません- (
-flto
および他の変更がない場合)、アプリは上記のエラーでリンクに失敗します
このリンカ エラーの原因は何ですか?
llvm - lto リンク後に llvm IR を取得する
lto にリンクした後に llvm IR を取得する方法はありますか? たとえば、次の行があります。
$ clang -flto -O2 ac main.c -fuse-ld=gold -v -save-temps
a.c
したがって、ファイルとファイルが1つに(またはIRで)main.c
リンクされているllvm IRを取得したいと考えています。オプションを追加しようとしましたが、エラーが発生しました:monlithic.bc
monlithic.o
-Wl,-plugin-opt=save-temps
libLLVMLTO: コマンド ライン引数 'save-temps' が不明です。試してください: 'libLLVMLTO -help' clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)
また、IR の lto 変換をダンプする方法はありますか?
gcc - gcc-ar と gcc-ranlib を使用する autoconf レシピ
GCC と Clang の両方でコンパイルし、静的ライブラリを構築するプロジェクトでリンク時最適化 (LTO) を使用しています。GCC 4.8 で動作していますが、GCC 5.4 はシン LTO オブジェクトを作成し、 automake がそれを使用して静的ライブラリをビルドしようとするとar
、ラッパー スクリプトが必要なため失敗しますgcc-ar
。
gcc-ar
automakeの代わりにar
(および同様に) を使用する方法について、私が見ることができる良い例はありgcc-ranlib
ますか? おそらく何かをハッキングできますが、理想的には次のようにする必要があります。
- コンパイラに適切なツールを使用します (Clang には独自の命令があります)。
- ユーザーがコンパイラをシステムのデフォルトではないものにオーバーライドした場合でも機能します。
- クロスコンパイル時の動作
debugging - gcc LTO がデバッグ シンボルを削除しているように見える
ARM Cortex-M4 プロセッサで実行されているプロジェクトがあり、gcc リンク時最適化 (LTO) 機能を含めようとしています。
現在、私のコンパイルとリンクのフラグは次のとおりです。
これらのフラグを使用するとすべてが正常に機能し、プロジェクトを正しくデバッグできます。
-flto
次に、CFLAGSに追加してみました。プログラムは正常に動作しますが、プロジェクトをデバッグすることができなくなり、gdb がデバッグ シンボルが見つからないという不平を言います。ELF ファイルを (LTO を有効にして)実行objdump -g
すると、次の出力が得られます。
欠落している.debug_info
セクションに注意してください。プロジェクト設定に戻り、-flto
CFLAGS から削除するだけで問題が解決します。objdump -g
LTO なしの ELF ファイル.debug_info
では、プロジェクト内の関数への適切な参照で満たされたセクションが表示され、デバッグが再び正常に機能します。
LTO とデバッグ シンボルを一緒にうまく再生するにはどうすればよいですか?
編集:私のgcc情報を含めるのを忘れていました。私はGNU ARM Embedded Toolchainを使用しており、テストはバージョン 5.4-2016q2 および 5.4-2016q3 で実行されました。
c++ - std::complex 間の型の不一致リンク時の最適化を使用した gcc 6 の下での C++ および Fortran の complex*16
C++ から Fortran ルーチンを呼び出す科学計算コードを使用していますが、gcc 6 で突然警告が表示されるようになりました。ベアボーンの問題は次のとおりです。
mult
で定義されている Fortran サブルーチンを考えてみましょうmult.f90
。
これを C++ ファイルから呼び出しますtest.cpp
。
g++-6 を使用してファイルをコンパイルすると、次の警告が表示されます。
次のいずれかを行うと、警告は消えます。
- g++-6 (私が持っているバージョンは 6.2.0) を g++-5 (バージョン 5.4.1) に置き換えます。
-flto
フラグなしでコンパイルする- double (std::complex の代わりに) と real*8 (complex*16 の代わりに) を使用します。
心配する必要がありますか、それとも無視できる警告ですか? 前者の場合、どうすれば問題を解決できますか?