問題タブ [msvc12]
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++ - 静的ライブラリ内のシンボルの解決 -- いつ起こるのか?
エラー
unresolved external symbol
プロジェクトのビルド中に依存関係を受け取りました。以前はこれが問題ではなかった理由を理解したいと思います。
背景情報
プロジェクトの依存関係グラフは次のようになります。
そのため、FreeImage のヘッダー ライブラリと静的ライブラリがあります。
FreeImaged.lib に対して明示的に静的にリンクして、gazebo_common をビルドします。
私は Gazebo を構築し、FreeImage.libとGazebo_common.libに対して明示的に静的にリンクします。
私はwpilibC++Simをビルドし、明示的にgazebo.libとgazebo_common.libに対して静的にリンクしますが、FreeImaged.libにはリンクしません
私は自分の FRCUserProgram をビルドし、gazebo.lib、gazebo_common.lib、および FreeImaged.lib に対して明示的に静的にリンクします。
ただし、これを行うと、 から取得および取得unresolved external symbol __imp_FreeImage_Initialize
されImage.cc.obj
ます。
調べるためにやったこと
ここで、魔法のコマンドを使用して、シンボルではなくシンボルが含まれているdumpbin /SYMBOLS
ことを明確に確認できます。__imp_ は、DLL からインポートされることを意図した関数であることを示していることを知っています。ただし、すべてが静的にリンクされている必要があるため、そのシンボルを入れるものは何でも間違っていました。FreeImaged.lib
FreeImage_Initialize
__imp_FreeImage_Initialize
Image.cc.obj
これを修正するにはFRCUserProgram.exe
、FreeImage の動的ライブラリにリンクするか、FREEIMAGE_LIB
定義された変数を使用して Gazebo_common (したがって Image.cc.obj) を再構築します。これにより、シンボルの前に __declspec(import) と __imp_ が追加されなくなります。 .
何よりも、どこにも Dll はありません。存在しません。私はそれを持っていません。静的ライブラリを使用しようとしていますFreeImaged.lib
。したがって、正しいシンボルが組み込まれるFREEIMAGE_LIB
ように、 を定義するのが正しいと思います。Image.cc.obj
もちろんこれは機能しますが、以前は問題にならなかった理由がわかりません!
質問:
これらのシンボルは、gazebo.exe ではなく FRCUserProgram.exe に対して解決する必要があるのはなぜですか?
c++ - Delphi: デバッガーで C dll 関数を呼び出すと、デバッガーなしで 15 秒、0.16 秒かかります。なんで?
私は次の設定をしています:
- Delphi XE5 で記述され、Debug 64 ビットでビルドされた Delphi コマンド ライン アプリケーション。
- Microsoft Visual Studio 2013 で記述され、リリース 64 ビットに組み込まれた AC dll。
- Delphi コマンド ライン アプリケーションは、C dll の関数を呼び出します。
予想外のこと:
- Delphi XE5 IDE 内で Delphi コマンド ライン アプリケーションをデバッグする場合、C dll 関数の呼び出しに 15 秒かかります。
- 同じ Delphi コマンド ライン アプリケーションを直接(IDE やデバッガを使用せずに)起動すると、C dll 関数の呼び出しに 0.16 秒かかります。
Delphi コマンド ライン アプリケーションのソース コード:
C dll ソース コード:
Delphi + C dll ソース コード: DelphiCplibraryCall.zip
ランタイム比較:
- 最初のコンソール: IDE でデバッグする場合
- 2 番目のコンソール: IDE なしで起動する場合
何らかの理由で、Delphi Debugger は C dll 関数の呼び出しを大幅に遅らせ、デバッグをほとんど不可能にしているようです。
この問題の原因や回避方法を知っている人はいますか? どうもありがとう。
編集:説明されている動作が Delphi IDE とデバッガーにまったく制限されていないことを確認できます。この問題は、次の場合にも発生します。
- Release の Microsoft Visual Studio 2013 で C dll をビルドします。
- そして、Visual Studio 2013 で C dll を呼び出すコマンド ライン実行可能ファイルをビルドしてデバッグします。
つまり、C dll リリース ビルド関数の実行時間は、デバッガが接続されているかどうかによって異なります。
delete values;
また、デバッガーが存在するとすぐに時間がかかるのは unordered_map ( ) の削除であることも確認できます。
c++ - std::thread が DLLMain でデッドロックを引き起こす
つまり、これが私が話していることです: std は複雑です。
VS2013 では、この単純なプログラムでデッドロックが発生します。
DLLMain でスレッドを作成するのは完全に間違っていますか? それは真実ではない。Microsoft のドキュメント「DLL を作成するためのベスト プラクティス」から: 「スレッドの作成は、他のスレッドと同期しない場合に機能する可能性があります」。したがって、CreateThread は機能し、_beginthreadex は機能し、boost::thread は機能しますが、std::thread は機能しません。これはコール スタックです。
さて、 std::thread は「他のスレッドと同期」します。
しかし、なぜ ?
これがVS2015で二度と起こらないことを願っています。まだテストしていません。
windows - コードを実行している MSVC プロファイラーを検出するにはどうすればよいですか?
Windows API に似たものを探していますIsDebuggerPresent()
が、コードが MSVC2013 でプロファイリングされているかどうかを判断します。そのような API は存在しますか、それとも別の方法がありますか?
c++ - Visual Studio で gcc コードをコンパイルすると、エラー C3646: '__attribute__': unknown override specifier が発生する
次のエラーが表示されます。
エラー C3646: '__attribute__': オーバーライド指定子が不明です
コード:
完全なエラー:
1>c:\program files\indri\indri 5.9\include\indri\greedy_vector(52): エラー C3646: '__attribute__': 不明なオーバーライド指定子
追加情報: Visual Studio プロジェクトで indri.lib を使用しようとしています。