問題タブ [g++]
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++ - 特定のコードで g++ が -mregparm を無視するようにするにはどうすればよいですか?
背景:
個人的なプロジェクトとして、C++ でカーネルを開発しています。順調に進んでいます。実際、私はカーネル ランドで利用可能な多くの C++ を非常によくサポートしています (libc と libstdc++ のほぼ全体を実装しました)。
より困難でコンパイラ固有のものの 1 つは、RTTI と例外のサポートです。今のところ、例外を完全に無効にしていますが、RTTI などはdynamic_cast
非常に便利なので、RTTI が必要です。これを機能させるために、g++ が期待するものと一致する std::type_info の基本的な実装を用意してから、g++ のlibsupc++.a
andにリンクしlibgcc_eh.a
ます。これはうまくいきます。RTTI はチャンピオンのように機能します。
質問:
私はいくつかの最適化オプションをいじっていましたが、いつか -mregparm をコンパイル時の選択肢として使用したいと考えています。明らかに、これはカーネルであり、アセンブリ コードと対話する必要があります。スタックにパラメーターがない場合、適切に機能しない特定の関数があります。これを解決するために、次のマクロを使用します。
繰り返しますが、これは非常にうまく機能します。問題は、dynamic_cast
. コンパイルは、いくつかの暗黙的に定義された内部関数 (前述のサポート ライブラリで定義されている) への呼び出しを発行し、-mregparm フラグを考慮して行います。もちろん、私はシステムのサポート ライブラリにリンクしているので、互換性のある呼び出し規約がある場合とない場合があります (私の場合はありません)。これらの関数は暗黙的 (どのファイルにもプロトタイプがない) であり、長くて壊れた名前を持っているため、asmlinkage 属性をそれらに追加することは (ほぼ) 不可能です。
頭に浮かぶ3つの可能な解決策があります。
- -mregparm を一緒にサポートすることを忘れてください。
- これら 2 つのサポート ライブラリをカーネルと同じフラグで再コンパイルします。これは煩わしく、少し非現実的かもしれません (gcc ビルドからきれいに分離できるかどうかはわかりませんし、ツールチェーンのアップグレードは非常に苦痛になる可能性があります) が、うまくいくはずです。
- 特定の .a/.o ファイルにあるコードを呼び出すときに、何らかの方法でコンパイラが -mregparm を無視するようにします。
オプション3は可能ですか?私の直感はノーですが、ここにはいくつかのg ++の専門家がいるので、私は尋ねると思いました:-)。
c++ - 一時オブジェクトのメソッドを呼び出しても安全ですか?
char* を返す関数があります。いくつかの文字列を連結する必要があるため、次の行を書きました。
使用したい文字列に名前を付けるという質問を避けることができることを知っています。より一般的な質問をする機会を得たいだけです: 一時変数のメソッドを呼び出すのは安全ですか? 規格に準拠していますか?
c++ - コンストラクターの定義と宣言の不一致
次の C++ コードがありました。宣言内のコンストラクターへの引数は、コンストラクターの定義とは異なる constness を持っていました。
g++ を使用して警告なしでこれをコンパイルすることができました。64 ビットの solaris に組み込まれている C++ コンパイラでリンカー エラーが発生したことが判明しました。これにより、問題があることに気付きました。
この場合、一致する引数のルールは何ですか? それはコンパイラ次第ですか?
c++ - WindowsからPS3でCellLinux用にクロスコンパイルする方法は?
cygwinツールチェーンを使用してWindowsPCでCellLinuxプログラムをコンパイルできるようにするには、クロスコンパイルのセットアップをどのように実現できますか?cygwinツールは、クロスコンパイラのビルドに使用するGNUコンパイラと、ビルドプロセスに関連するツール(rpm、cpio、make、flex、bisonなど)を提供します。
私はこれが可能であると適度に確信していますが、実際にこれを行った人は誰も知りません。これはx86Linuxですでに行われていますが、2番目のオペレーティングシステム全体を実行している仮想マシンの使用とオーバーヘッドを必要とせずに、Windowsを使用したいと思います。
Cell Linuxツールチェーンはパッチが適用されたGNUツールチェーンであり、PPUおよびSPUプロセッサ用のCおよびC ++コンパイラ、および関連するbinutilsを備えています。CellLinux用のCellLinuxSDKのソースは、ここにあります。ここでのソースRPMSには、Linuxのrpmbuildツールで使用するためのビルドスクリプトがあります。
具体的な質問は、PPUおよびSPUプロセッサ用のCell Linux GNUコンパイラのセットを、Cygwinを使用してWindows上でどのように構築できるかということです。
c++ - バイナリで使用されていないものを含めたりリンクしたりすると、どのような悪影響がありますか?
作成しているバイナリがあり、実際には使用されないファイルの束をインクルードし、それらのインクルードファイルによって記述されたライブラリへの後続のリンクを実行するとしますか?(繰り返しますが、これらのライブラリは使用されません)
コンパイル時間の増加を超えて、これの悪影響は何ですか?
c++ - なぜこれは C でコンパイルされ、C++ ではコンパイルされないのですか (sigaction)?
g++ を使用して以下のコードをコンパイルしようとすると、次のエラーが発生します。gcc を使用してコンパイルすると、正常に動作します (いくつかの警告を除いて)。どんな助けでも感謝します。
c++ - g++ コンパイラを使用して別のディレクトリにオブジェクト ファイルを生成する - C++
次のコードを使用して、cpp ファイルをオブジェクト ファイルにコンパイルします。
上記のコードは、main.cpp が存在するディレクトリと同じディレクトリに .o ファイルを生成します。
- obj という名前のフォルダーがあり、そこにオブジェクト ファイルを生成する必要があるとします。
- g++ でサポートされているコンパイラ スイッチとその使用法を確認するにはどうすればよいですか?
どんな助けでも素晴らしいでしょう
ubuntu - Ubuntuにg++4.4をインストールするにはどうすればいいですか?
Debian g ++-4.4パッケージがありますが、Ubuntuではありません。ウェブ上には、システムによって破壊された恐ろしい話が多すぎます。
Ubuntuにg++4.4をインストールするにはどうすればよいですか?
c++ - typeid()はg++で余分な文字を返します
上記のコードは、g++を使用してubuntuマシンでP3fooを出力します。fooだけでなくP3fooを出力する理由がわかりません。次のようにコードを変更した場合
3fooを出力します。
何かご意見は?