問題タブ [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.
templates - g++ のテンプレート ファンクター エラー
マップ内のマップされた値を使用して要素のベクトルを作成したいコードがあります。以下のコードは Visual Studio で正常に動作します (そして、私が知る限り、正当に思えます) が、g++ は同意しません。
残念ながら、現時点では正確なエラー テキスト (使用するオーバーロードされた関数を特定できないことに関するもの) または g++ の特定のバージョン (最新版は Ubuntu で配布されています) を持っていませんが、それを取得したら、この投稿を更新してください。
それまでの間、提供されているファンクターの型を g++ が解決できない理由を誰か説明できますか?
c++ - g++ が不要な例外処理コードをリンクしないようにするにはどうすればよいですか?
arm-eabi 用にコンパイルされた GCC/G++ を使用して組み込みアプリケーションを開発しています。リソースの制約により、標準の C++ 例外処理を無効にしようとしています。「-fno-exceptions -nostartfiles -ffreestanding」でコードをコンパイルしています。
クラスのグローバル インスタンスが存在し、そのクラスに別のクラスのインスタンスがメンバーとして含まれている場合、多くの例外処理コードがリンクされています。 printf、fopen、fclose、その他の FILE 関数などの stdio のもの。このアプリケーションにはファイルシステムがなく、たとえあったとしても、これらの関数はコード スペースを浪費しすぎます。
ライブラリには例外を使用しない演算子 new (new(nothrow) を除く) がないため、-fno-exceptions を使用しても、G++ は例外を使用する演算子 new にリンクすることを理解しています。new 演算子と delete 演算子の代替を作成しました。これらは、不要な標準ライブラリ関数だけでなく、出力にもリンクされています。
私を困惑させているのは、私がどこにも新しいと呼んでいないということです。グローバル オブジェクトに、このすべてのコードがリンクされている別のオブジェクトが含まれている場合のみです。
例えば:
UartA のグローバル インスタンスが作成された場合、例外処理、新しい演算子、および標準入出力はリンクされません。これが私の望みです。
UartB のグローバル インスタンスが作成される場合 (ここで、rxbuf はポインターではなくインスタンスです)、不要なコードがリンクされます。
UartA も UartB も、演算子 new、例外、または stdio を使用しません。rxbuf のタイプのみが異なります。
余分なコードのリンクを防ぐ方法を提案できますか? また、これが UartB にリンクされているのに、UartA にリンクされていないのはなぜですか?
c++ - 共有オブジェクト (.so) からの Linux の例外
ftestというテストプログラムがあります。テストを含む .so ファイルをロードし、そこで見つかったテストを実行します。これらのテストの 1 つは、O/RM 用の Postgres データベース ドライバーを含む .so をロードして実行します。
Postgres ドライバーがその .so ファイル (またはリンク先であるが ftest はリンクしていないファイル) で定義されている例外をスローし、テスト フレームワークによってキャッチされると、例外デストラクタが segfault をトリガーします。
この segfault は、コンパイルされた例外が (dload を使用して) 動的にロードされた .so にある場合に必ず発生します。
この種のことは、同じアーキテクチャを持つ Windows で問題なく動作します。コア ライブラリからの例外のみを使用するように自分自身を制限したくはありません。アドインは、独自の例外クラスを自由に作成し、通常どおり処理できるようにする必要があります。
例外は std::exception のサブクラスです。例外がライブラリ (libpqxx など) で定義されている場合もあります。これは、例外が制御できない場合があることを意味します。
例外は、次のようなものを使用してスローされます。
そして、次を使用してキャッチされます:
これを機能させるために必要な特別なコンパイラ オプションはありますか? 経由で例外をスローするように切り替える必要がありthrow new exception_class( args )
ますか (実際にはこれを行いたくありません)。
gcc - GNU C++ エラー メッセージ
オンラインで入手できる g++ コンパイラのエラー/警告メッセージの包括的なリストはありますか?
各メッセージの意味を説明し、そのようなエラーの原因となる条件を示すサンプル コードが含まれている MSDN ドキュメントに似たものを探しています。
GCC のオンライン ドキュメントを見てきましたが、考えられるすべてのメッセージの単純な列挙すら見当たりません。
visual-c++ - GCC/G++ の VC++ #import ディレクティブ
VC++ の例を提供するライブラリをテストしようとしています。ただし、すべてのプロジェクトで gcc/g++ を使用しています。
さて、VC++ の例がライブラリにアクセスする方法は、#importディレクティブを使用してライブラリ DLL の場所を渡し、名前空間LIBRARYNAMEを使用して、未定義の型を作成できることです (定義されていると仮定します)。 DLL で) __uuidof を使用して新しいインスタンスを作成します。それ以降、ライブラリ関数の 1 つを呼び出すには、この例では単にcreatedObj->foo()を実行するだけです。
うーん... g++ の #import は VC++ の import (こちらを参照) とは異なるため、この例はうまくいきません。
これを g++ でコンパイルできるように変換する方法はありますか? または、ライブラリ開発者が試してみることのできる静的ライブラリを提供してくれるまで、私は SOL ですか?
c++ - 新しい演算子が呼び出されないのはなぜですか
動的にロードされたライブラリ(dlopenなどでロードされた)が実際に独自の新しい削除演算子を使用し、呼び出し元のプログラムで定義されたものではないことを確認したかったのです。だから私は次のlibrary.cppを書きました
でコンパイルしました
または雇用されたロシア人が試みることを提案したように(しかし結局何も変わらなかった)
クラスBaseは、この値を取得するためにint値と関数get_value()のみを保持しています。その後、client.cppをこのように書きました
でコンパイルしました
クライアントを実行すると、「呼び出されたクライアントの新規」と「呼び出されたクライアントの削除」のみが表示されます。コンパイラスイッチ-Bsymbolicをライブラリに使用しても、EmployedRussianが提案しました。
今:何が悪かったのですか?共有ライブラリは独自のnew/deleteを使用していると思ったので、ファクトリの隣にライブラリコードでデストラクタdestroyを作成するように指定する必要があります。
補足質問:destroy(Base * p)関数が必要なのはなぜですか?この関数がクライアントのdelete-operatorのみを呼び出す場合は、自分でそれを行うこともできます。つまり、最後の行の次のdestroy_module(a)の代わりに「deletea」を実行します。
私が見つけた回答:ライブラリは、new/delete-operatorのペアも提供できます。したがって、最初にライブラリの新しいものを使用し、後でクライアントの削除を使用すると、おそらく落とし穴に踏み込むことができます。悲しいことに、これまで、自分のライブラリが独自の新規または削除を使用しているのを見たことがありませんでした...したがって、元の質問にはまだ回答されていません。
補足:私はLinuxプラットフォームについてのみ言及しています。
編集:重要な部分は、雇用されたロシアの回答へのコメントにあります。だから私は一言で言えば主な手がかりを与えています:このようにgccを呼び出す場合
ライブラリは独自のnew/delete演算子を使用します。そうでなければ結果
呼び出し側プログラムのnew/delete演算子を使用しているライブラリー内。雇用されたロシア人に感謝します!
g++ - g++ シンボルのバージョン管理。g++ のバージョン 4 を使用して GCC_3.0 に設定します。
Sun-java6-jdk がインストールされた XUbuntu 8.10 で、JNI を使用して会計プリンターを制御する Java クラスを実装する必要があります。
構造は次のとおりです。
EpsonDriver.java が libEpson.so を読み込みます
libEpson は、EpsonFiscalProtocol.so (エプソン提供、ソースなし) および pthread と動的にリンクされています。
javah を使用してヘッダー ファイルを生成すると、コードがコンパイルされます。次に、libEpson.so を $JAVA_HOME/jre/lib/i386 に置き、EpsonDriver.java は静的初期化を使用します。
ただし、その部分は機能しますが、いずれかのメソッドを使用しようとすると、unsatisfiedLinkError 例外が発生します。
少し前に、同僚が動作するバージョンを作成し、objdump -Dslx を使用して次の結果を得ました。
最近コンパイルされたファイルでは、次のようになります。
したがって、主な違いは GCC_3.0 シンボルだと思います
libcom_tichile_EpsonSerialDriver.so を次のコマンドでコンパイルします (現在仕事をしていないため、メモリから)
g++ にそのシンボル バージョンを使用するように指示する方法はありますか? またはそれを機能させる方法のアイデアはありますか?
編集:次のダンプを含む別の非動作バージョンがあります:
主な違いは GCC_3.0 シンボル/ABI にあると思います
編集: 幸いなことに、同僚が Java を使用してプリンターと通信する方法を見つけました。
g++ - i386mingw32-g++ が作成されていません :(
Linux に MinGW クロス コンパイラをインストールしましたがi386mingw32msvc-g++
、C++ アプリケーションをクロス コンパイルできないため作成できません。それを作成するために何をしなければなりませんか?
には/usr/local/cross-tools/bin
、これらすべての実行可能ファイルがあります。
- i386-mingw32-addr2line
- i386-mingw32-ar
- i386-mingw32-as
- i386-mingw32-gcc
- i386-mingw32-gcc-3.4.2
- i386-mingw32-gccbug
- i386-mingw32-c++filt
- i386-mingw32-cpp
- i386-mingw32-size
- 等
i386mingw32msvc-g++ ではありません
ビンで作成するにはどうすればよいですか?
c++ - C++コードのコンパイル中にios::nocreateエラーが発生しました
一方、RHEL5.0でC++で記述されたパッケージをコンパイルします。次のエラーが発生します。
>エラー:nocreate
のメンバーではありませんstd::ios
ソースコードは以下に対応します:
ifstream tempStr(
argv[4]
、ios::in
|ios::nocreate
);
私が試してみました
#g ++ -O -Wno-deprecated <file.cpp> -o <file>
と同様:
#g ++ -O-o<ファイル>
解決策を提案してください。