問題タブ [tdm-mingw]

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.

0 投票する
7 に答える
10101 参照

c++ - GCC を使用した C++ インライン関数 - なぜ CALL なのか?

C++ でインライン関数呼び出しをテストしています。

C++ プログラミング言語の Stroustrup は次のように記述します。

インライン指定子は、関数のコードを一度配置してから通常の関数呼び出しメカニズムを介して呼び出すのではなく、インラインでコード [...] を生成しようとするコンパイラへのヒントです。

しかし、生成されたコードが単にインラインではないことがわかりました。isquare関数のCALL命令があります。

代替テキスト

なぜこうなった?インライン関数を使用するにはどうすればよいですか?

編集:使用されるコマンドラインオプション:

0 投票する
1 に答える
2136 参照

c++ - -std=gnu++0x を使用した g++ での fstream リンク エラー

Windows の tdm-mingw g++ 4.4.0 で -std=gnu++0x パラメータを使用してアプリケーションをビルドしました。

これは ofstream オブジェクトを使用しており、ビルドすると次のリンク エラーが発生します。

デフォルトの古い標準を使用すると、適切にビルドされます。

これが唯一のエラーであり、-lstdc++ でリンクしようとしても役に立ちません。誰かがこれを経験したことがありますか?何か提案はありますか?

編集:次のような ofstream オブジェクトを作成しています:

うまくコンパイルされていますが、リンクされていません。

0 投票する
3 に答える
11691 参照

c++ - C ++ GCC4.4警告:配列の添え字が配列の境界を超えています

最近GCC4.4(MinGW TDMビルド)にアップグレードしましたが、次のコードで次の警告が表示されます。

メンバー関数で'voidConsole :: print(const std :: string&)':

警告:配列の添え字が配列の境界を超えています

コードは次のとおりです。

何か案は?


それを行っているのは最適化です...

また、それを引き起こしているのはこの行のようです:


はい、わかりました。boost:: is_any_of()の引数です。string()コンストラクターでラップすると、警告が消えます。ご協力いただきありがとうございます:)

0 投票する
3 に答える
1059 参照

c++ - エクスポートされたdll関数からdll内のグローバルデータへのアクセス

いくつかのグローバルデータを使用してC++Win32dllを作成しています。グローバルに定義されたstd::mapがあり、データをマップに書き込むエクスポートされた関数がdllにあります(もちろん、書き込みロックを取得した後)。

私の問題は、dll DllMain内から書き込み関数を呼び出すと、問題なく動作することです。しかし、別のプログラムからdllをロードし、データをグローバルマップに書き込む関数を呼び出すと、次のエラーが発生します。

これについて何かできることはありますか?DllMainから呼び出された場合、同じ関数はdll内のグローバルデータにアクセスできますが、別のプロセスから呼び出された場合、グローバルデータにアクセスできません。ご意見をお聞かせください。

TDM-MinGWgcc4.4.0コンパイラを使用しています。

編集: わかりました、私は問題が何であるかを理解しました、そして助けてくれた人に感謝します、しかし問題はコンストラクターの問題やグローバル空間にマップを持つことができないことではなく、私がブースト::pythonの問題でした使用しています。テストしましたが、Pythonなどからdllを呼び出していたため、urllib2モジュールがdllに読み込まれていませんでした。今、私はそれを修正する方法を見る必要があります。

0 投票する
10 に答える
3305 参照

c++ - GCC:空のプログラム== 23202バイト?

私はフラグを使用していません(私はgccの初心者です)、コマンドだけです:

私はwin32でGCCの最新のTDMビルドを使用しました。結果の実行可能ファイルはほぼ23KBで、空のプログラムには大きすぎます。

実行可能ファイルのサイズを減らすにはどうすればよいですか?

0 投票する
5 に答える
6259 参照

c - x86、win32 での空のプログラムの GCC のアセンブリ出力

私は空のプログラムを書いて、stackoverflow コーダーを悩ませていますが、そうではありません。私はちょうどgnuツールチェーンを調べています。

以下は私には深すぎるかもしれませんが、空のプログラムの物語を続けるために、GNU が消費するものである C コンパイラの出力を調べ始めました。

test.c:

gcc -S test.c

ここで何が起こっているのか説明できますか? ここにそれを理解するための私の努力があります。asマニュアルと最小限の x86 ASM の知識を使用しました。

  • .file "test.c"論理ファイル名のディレクティブです。
  • .def: ドキュメント「シンボル名のデバッグ情報の定義を開始する」によると。シンボル(関数名・変数?)とは何ですか?デバッグ情報とは?
  • .scl: ドキュメントには、「ストレージ クラスは、シンボルが静的であるか外部であるかにフラグを付けることができます」と記載されています。これは、私が C から知っているのと同じ静的および外部ですか? そして、その「2」は何ですか?
  • .type: パラメータを「シンボル テーブル エントリのタイプ属性として」保存します。手がかりがありません。
  • .endef: 問題なし。
  • .text:これは問題です。セクションと呼ばれるもののようで、コードの場所であることを読みましたが、ドキュメントはあまり教えてくれませんでした。
  • .globl 「シンボルをldに見えるようにします。」、マニュアルはこれについて非常に明確です。
  • _main:これは、メイン関数の開始アドレス (?) である可能性があります
  • pushl_: EBP をスタックに配置するロング (32 ビット) プッシュ
  • movl: 32 ビット移動。疑似 C:EBP = ESP;
  • andl: 論理積。Pseudo-C: ESP = -16 & ESP、これが何を意味するのかよくわかりません。
  • call: IP をスタックにプッシュし (呼び出されたプロシージャが戻る方法を見つけることができるように)、現在の場所に進み__mainます。(__main とは?)
  • movl: このゼロは、コードの最後に返す定数でなければなりません。MOV はこのゼロを EAX に配置します。
  • leave: ENTER 命令 (?) の後にスタックを復元します。なんで?
  • ret: スタックに保存されている命令アドレスに戻ります

ご協力ありがとうございました!

0 投票する
1 に答える
5400 参照

boost - Boost.Buildが呼び出すg++コマンドラインを確認する方法(1.33.1)

自分のマシンでBoostライブラリをビルドしたときに、インポートライブラリが生成されない理由を理解しようと頭を悩ませています。より具体的には、DLLの構築は正常に機能しますが、以前(つまり、マシンを再インストールする前)にインポートライブラリを正しく生成していました。

いくつかの仕様:

  • ブースト1.33.1
  • Windows用のg++4.3.3TDM-1リリース
  • gccMSDosコマンドラインプロンプトからのツールセットを使用したビルド
  • UnxUtils(14-04-03以降)

bjam.exeを呼び出すコマンドラインは次のようになります。

これは以前は素晴らしく機能し、目的のファイルを作成していましboost_thread.libたが、現在はそうではありません。私は本当に何が起こっているのかわかりません。リンカがコマンドラインで何を受け取るのか、そしてリンカがそれで何をすべきだと考えているのかを正確に知りたいのです。

ありがとう、

カール

0 投票する
6 に答える
3153 参照

c - WindowsでのC開発に使用する単体テストフレームワークはどれですか?

Windows XPでは、基本的な開発にTDMのGCC / MinGW32を使用します。つまり、gcc4.4.xとgdbを使用します。テスト駆動開発に使用する単体テストフレームワークはどれですか?

どうやらCheckのユニットテストはまだWindowsでは動作しません。

CのユニットテストフレームワークとCコードのユニットテストでの質問は似ていますが、Windowsでのgcc4.4.xの使用については特に説明していません。

0 投票する
1 に答える
21112 参照

c++ - 静的ライブラリをリンクする際のインライン関数の複数定義

mingw (Windows 用 gcc) でコンパイルする C++ プログラムがあります。gcc 4.4.1 を含む mingw の TDM リリースを使用します。実行可能ファイルは、2 つの静的ライブラリ (.a) ファイルにリンクしています。そのうちの 1 つは C で記述されたサードパーティ ライブラリです。もう 1 つは、私が作成した C++ ライブラリで、C ライブラリを使用して独自の C++ API を提供します。

C ライブラリの機能の (私の見解では、過度の) 一部がインライン関数で実装されています。C ライブラリの API を使用するときにインライン関数を含めることは避けられませんが、すべてをリンクしようとすると、すべてのインライン関数の複数の定義があるというリンク エラーが発生します。私のC++ラッパーライブラリと私が持っていないライブラリで呼び出された場合、基本的にヘッダーでインラインで定義されたものはすべて、CライブラリとC++ライブラリの両方で作成された関数を取得しています.

インクルード ファイルが同じプロジェクト内の異なる .c または .cpp ファイルで複数回使用されている場合、複数の定義エラーは発生しません。問題は、ライブラリごとに 1 つの定義が生成されることだけです。

コンパイラが両方のライブラリでこれらのインライン関数の関数とシンボルを生成する方法/理由は? コードでそれらの生成を強制的に停止するにはどうすればよいですか? .a ファイルから重複した関数を削除するために実行できるツール、またはリンカーに複数の定義を無視させる方法はありますか?

(参考までに、サードパーティのライブラリには、すべてのヘッダーに #ifdef __cplusplus および extern "C" ガードが含まれています。とにかく、それが問題である場合、シンボルの複数定義は発生しません。シンボルが定義されていないか、少なくとも異なります。)

特に、サード パーティの C ライブラリの DLL にリンクすると、リンク エラーは発生しません。ただし、DLLから呼び出す必要がある独自のバージョンの関数を持つコードに関係しているように見える奇妙なランタイムエラーが発生します。(あたかもコンパイラが私が求めていない関数のローカル バージョンを作成しているかのように。)

この質問の同様のバージョンが以前に尋ねられましたが、これらのいずれにおいても私の状況に対する答えが見つかりませんでした:

この質問に対する答えは、ポスターが変数を複数定義しているということでした。私の問題は、インライン関数の複数の定義です: 複数の cpps に同じヘッダーを含めることによる複数の定義エラーの繰り返し

これは MSVC プログラムでしたが、mingw を使用しています。また、この質問でのポスターの問題は、ヘッダー内のクラス本体の外側にある C++ クラス コンストラクターの定義でしたが、私の問題はインラインの C 関数にあります: Static Lib Multiple Definition Problem

この愚か者はすべての C コードの名前を C++ ファイルに変更しましたが、彼の C コードは C++ セーフではありませんでした: リンク時に多数の std:: 関数を複数定義する

これは、1 つの定義ルールに違反してもエラーにならない理由を知りたいだけでした: 定義が異なるインライン関数の予測できない動作

0 投票する
1 に答える
933 参照

mingw - MinGWのrand_s

rand_sCRTの一部であるこの関数は、アプリケーションの開発中に非常に役立つことがわかりました。ただし、最近のMinGWヘッダーファイルではプロトタイプ化されていないことを理解しています。

したがって、私はそのような機能を提供またはプロトタイピングするための包括的な手段を求めています。スタイルフックの使用を検討しました#ifdef MINGWが、将来のリビジョンで関数のプロトタイプが作成された場合、これは失敗する可能性があります。

したがって、MinGWでコンパイルできるように、関数をプログラムで使用できるようにするための最良の方法は何ですか?