問題タブ [gcc4]
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.
gcc - GCCの問題、2つの異なる(ただし類似した)システムで異なる出力を生成する
プロジェクトの1つで、EAX暗号化にBrianGladmanのライブラリを使用しています。
問題は、コードがローカル開発環境(virtualboxで実行されているUbuntu)で機能するが、Amazon AWSクラウドで実行されているシステムでは同じコードが機能しない(暗号化が正しくない)ことです。
GCCのバージョンと、ローカル環境とクラウドの両方を確認しました。バージョンは同じです:
gccバージョン4.4.5(Ubuntu / Linaro 4.4.4-14ubuntu5)
どのような場合にこれが発生する可能性がありますか?何か案は?
c++ - gcc 4.3 のデフォルト仕様ファイルを設定するには?
gcc バージョン 4.3.2 を使用している場合、以下を使用してスペックを生成する方法を確認できます。
libgcc と同じディレクトリに移動します。
変更可能な入力済みスペック ファイルがあります。ただし、それが完了しても、次のことがわかります。
-specs
コンパイルごとにパラメーターを渡すように強制するのではなく、デフォルトでその仕様ファイルを使用するようにgccに指示するにはどうすればよいですか? 私が持っている別のシステムと一致させたいのですが、次のようになります。
ご覧のとおり、2 つのシステムの主な違いは、既存のセットアップが 32 ビットであり、現在 64 ビット システムでそれを一致させようとしていることです。Linux のバージョンはそれ以外は同じで、同じバージョンの gcc をコンパイルしています。(両方のシステムで、gcc 4.3.2 は 2 番目の gcc インストールであり、4.1.2 は 4.3.2 のコンパイルに使用されます)
c++ - gcc-4 と互換性のある gcc-3 バイナリ
gcc 3.4.3 でコンパイルされたスタティック ライブラリがあります。gcc-4 でコンパイルされるコードでこれを使用したいと考えています。gcc-3 と gcc-4 バイナリには互換性がなく、ライブラリを再コンパイルする必要があることを漠然と読みましたが、これについて確認したいだけです。gcc-4 で使用できる gcc-3 ライブラリはありませんか?
c++ - GCC 4.5、ブーストおよび throw_error_already_set
Python 2.2.3、Boost 1.46、およびこの簡単な拡張モジュールを使用:
Boost をビルドすると、GCC 3.4.5 (Mingw on XP SP3) を使用してこのモジュールをビルドすると、すべてがうまく機能します。
コンパイラ(GCC 4.5.2)以外は何も変更しないと、次のようになります。
そこで、gdb を起動し、中断を中断します。error_already_set 例外が誰にもキャッチされていないように思えます:
面白いことに、私の実際の使用例では、クラスにいくつかのメソッドがラップされています。それらのいくつかでは、error_already_set メカニズムが機能します。他の人にとってはそうではありません... C++の第一人者はこれについて何かヒントを持っていますか?
c++ - LruCache クラスのテンプレート型を定義できません
単純にやってみると
LruCache キャッシュ;
次のコンパイル エラーが発生します。
ただし、テンプレート型なしでクラスを定義すると。すなわち
それはうまくコンパイルされます。
cmake - CMake と GCC 4.1.2 を使用した stdc++ へのリンク
私はライブラリを開発していて、それが 4.1.2 でコンパイルされることを確認する必要があります (私は知っていますが、それは私に喜びをもたらしません)。そのため、Fedora 14 マシンで、GCC41 をダウンロード、コンパイル、およびインストールしました。
CMake では、次の変数のみを変数 CMAKE_CXX_COMPILER=/opt/gcc41/bin/c++41 CMAKE_C_COMPILER=/opt/gcc41/bin/gcc41 に変更します。
正常にコンパイルされますが、標準ライブラリの間違ったバージョンを使用しているようです。エラーは次のようになります。
.../include/c++/4.5.1/ からインクルードを取得しているようですが、リンク先のライブラリのバージョンがわかりません。
これを制御する方法はありますか?
c++ - C-関数テンプレートへのコールバック:テンプレートを明示的にインスタンス化する
前提
次のインターフェイスを提供するCライブラリ(C ++から)を使用しています。
問題
ここで、関数テンプレートをコールバックとして登録する必要がありますが、これにより問題が発生します。次のコードを検討してください。
これにより、次のリンカーエラーが発生します(OSXではg++(GCC)4.5.1を使用しますが、コンパイラバージョン/プラットフォームの他のほとんどの組み合わせで機能します)。
アーキテクチャx86_64の未定義のシンボル:
私はそれを理解できると思います。
最初の「ソリューション」</h2>
これは、テンプレートを明示的にインスタンス化することで簡単に修正できます。
残念ながら、コールバックは関数テンプレート内に登録されているため、これは実際のコードには適用できません。また、この関数が呼び出されるテンプレート引数のセットがわからないため、すべての明示的なインスタンス化を提供できません。それら(私はライブラリをプログラミングしています)。したがって、私の実際のコードは次のようになります。
2番目の「ソリューション」</h2>
関数テンプレートは、関数を呼び出すことによって暗黙的にインスタンス化されます。それではそれを実行しましょう。ただし、呼び出しが実際に実行されていないことを確認してください(関数には副作用があります)。
これは、最適化が有効になっている場合でも機能するようです(コンパイラーによってデッドブランチが削除されるように)。しかし、これがいつか故障しないかどうかはわかりません。また、これは非常に醜い解決策であり、将来のメンテナがこの明らかに不要なコードを削除しないように、長さの説明コメントが必要です。
質問
テンプレート引数がわからないテンプレートをインスタンス化するにはどうすればよいですか?この質問は明らかにナンセンスです:私はできません。–しかし、これを回避するための卑劣な方法はありますか?
それを除けば、私の回避策は成功することが保証されていますか?
ボーナス質問
このコード(具体的には、関数ポインターをにキャストしたという事実void*
)でも、次の警告が生成されます。
ISO C ++は、関数へのポインタとオブジェクトへのポインタ間のキャストを禁止しています
でコンパイルするとき-pedantic
。ライブラリ用に強く型付けされたCラッパーを記述せずに(私の状況では不可能です)、どういうわけか警告を取り除くことができますか?
ideoneでコードを実行する(コンパイルするためのキャストが追加されています)
c++ - C/C++ で整数オーバーフローを検出する便利で信頼できる方法はありませんか?
いいえ、これは整数オーバーフローを検出する方法の複製ではありませんか? . 問題は同じですが、質問は異なります。
gcc コンパイラは、(-O2 を使用して) オーバーフロー チェックを最適化して取り除くことができます。次に例を示します。
gcc の人々は、これはバグではないと主張しています。C 標準によれば、オーバーフローは未定義の動作であり、コンパイラは何でも実行できます。どうやら、オーバーフローが発生しないことを前提としたものは何でも含まれているようです。残念ながら、これにより、コンパイラはオーバーフロー チェックを最適化できなくなります。
オーバーフローをチェックする安全な方法は、最近のCERT 論文に記載されています。この論文では、2 つの整数を加算する前に次のようなことを行うことを推奨しています。
どうやら、結果が有効であることを確認したい場合、一連の計算で +、-、*、/ およびその他の操作の前に、このようなことを行う必要があるようです。たとえば、配列インデックスが範囲外でないことを確認したい場合。これは非常に面倒なので、実際に誰も行っていません。少なくとも、これを体系的に行う C/C++ プログラムは見たことがありません。
さて、これは根本的な問題です:
配列にアクセスする前に配列インデックスをチェックすることは便利ですが、信頼性は高くありません。
CERT 法による一連の計算のすべての操作をチェックすることは信頼できますが、役に立ちません。
結論: C/C++ でオーバーフローをチェックする便利で信頼できる方法はありません!
標準が書かれたときにこれが意図されていたとは信じられません。
問題を解決できる特定のコマンド ライン オプションがあることは知っていますが、標準またはその現在の解釈に根本的な問題があるという事実は変わりません。
ここで私の質問は次のとおりです。gcc の人々は、オーバーフロー チェックを最適化して取り除くことを許可するときに「未定義の動作」の解釈を取りすぎているのでしょうか、それとも C/C++ 標準が壊れているのでしょうか?
追加された注: 申し訳ありませんが、私の質問を誤解している可能性があります。私は問題を回避する方法を尋ねているのではありません - それはすでに他の場所で回答されています。C 標準について、より基本的な質問をしています。オーバーフローをチェックする便利で信頼できる方法がない場合、言語自体が怪しいです。たとえば、境界チェックを使用して安全な配列クラスを作成した場合、安全であるはずですが、境界チェックを最適化して取り除くことができる場合はそうではありません。
規格がこれを可能にする場合、規格を改訂する必要があるか、規格の解釈を改訂する必要があります。
注 2 を追加: ここにいる人々は、「未定義の動作」という疑わしい概念について議論したがらないようです。C99 標準に 191 種類の未定義の動作がリストされているという事実 (リンク) は、ずさんな標準を示しています。
多くのプログラマーは、「未定義の動作」により、ハードディスクのフォーマットを含め、あらゆることを行うライセンスが得られるという声明をすぐに受け入れます。標準が整数オーバーフローを配列境界外への書き込みと同じ危険なカテゴリに分類しているのは問題だと思います。
これら 2 種類の「未定義の動作」が異なるのはなぜですか? なぜなら:
多くのプログラムは、整数のオーバーフローが無害であることに依存していますが、何があるか分からない場合に、配列境界の外側に書き込むことに依存するプログラムはほとんどありません。
配列の境界外に書き込むと、実際にはハードディスクをフォーマットするのと同じくらい悪いことをする可能性があり (少なくとも DOS のような保護されていない OS では)、ほとんどのプログラマーはこれが危険であることを知っています。
整数オーバーフローを危険な「なんでもあり」カテゴリに入れると、コンパイラが何をしているのかについて嘘をつくことを含め、コンパイラが何でもできるようになります (オーバーフロー チェックが最適化されていない場合)。
配列境界外への書き込みなどのエラーはデバッガーで見つけることができますが、最適化は通常デバッグ時にオフになっているため、オーバーフロー チェックを最適化して取り除くエラーは発見できません。
gcc コンパイラーは、整数オーバーフローの場合に「なんでもあり」ポリシーを明らかに控えています。オーバーフローが不可能であることを確認できない限り、ループなどの最適化を控える場合が多くあります。なんらかの理由で、gcc 関係者は、ここで「なんでもあり」ポリシーに従えばエラーが多すぎることを認識していましたが、オーバーフロー チェックを最適化して除外するという問題に対しては異なる態度をとっています。
たぶん、ここはそのような哲学的な問題を議論するのに適切な場所ではありません. 少なくとも、ここでのほとんどの回答は的外れです。これを議論するためのより良い場所はありますか?
ios - リリース ビルド用の dSYM ファイル
.dSYM
リソースには DWARF 情報以外の情報が含まれていますか? アプリのリリース ビルドを作成しました。これを実行dwarfdump
すると、実行可能ファイルに DWARF 情報がない (「空」である) と表示されますが、これは私が期待することです。しかし、それを実行dsymutil
すると、空でないシンボル ファイルが作成されます。これらはバイナリ ファイルなので、何が入っているかわかりません。誰でもこれについて教えてもらえますか?これらのファイルのビューアはありますか?
git - 自作でimagemagickをインストールするにはどうすればよいですか?
OSX LionにImagemagickをインストールしようとしていますが、期待どおりに機能していません。
醸造医師は言う:
はい、XCode4.1をインストールして実行しています。