問題タブ [visual-c++-2008]
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++ - VC9とVC8のlibの互換性
(元の質問はそこで尋ねられました:http ://www.ogre3d.org/phpBB2/viewtopic.php?t = 44832 )
「vs2008(VC9)ですべてをビルドしたいのですが、PhysX SDKはvs2005(VC8)でビルドされています。これにより、すべてのvc9コンパイル済みライブラリを使用してこのvc8ライブラリと組み合わせて使用すると、問題が発生しますか?」
VC8で生成された.libファイル(および.dll)を使用してvc9コンパイル済みexeに含める前日に、コンパイラーが.libファイルを開くことができなかったと答えました。
さて、他の人は問題なくこれをしたと答えました。
vc9とvc8の間のlibの互換性に関する情報が見つかりません。
だから...助けて?
visual-studio-2008 - VC9(MSVC 2008)で許可される装飾名の長さを増やすにはどうすればよいですか?
私はVC8からVC9に移植するためのかなり大きくて複雑なプログラムのセットを持っています。モジュールの1つには、いくつかの階層化されたtypedefがあり、コンパイラーはC4503警告(装飾名は切り捨てられます)を生成します。生成されたLIBファイルは、プロジェクト内の他のモジュールに適切にリンクされません。VC8はこれに問題がなく、装飾プロセスが変更されてさらに長い名前が生成されたか、装飾された名前の長さの内部制限が減少したと結論付けました。これを乗り越えるための最良の方法は何ですか?
レガシーコードの理由から、typedefをstructに置き換えるというMSDNの提案は実用的ではありません。
問題のtypedefは(サニタイズされたコード)です:
c++ - ActiveXプラグインにより、VS2008のアプリケーション終了時にASSERTが失敗します
「ESRIMapObjectsLT2」ActiveXプラグインを使用しているMFCアプリケーションは、閉じるときにASSERTをスローします。エラーは次の場所で発生しcmdtarg.cpp
ます:
VC9を使用して(ネイティブC ++)アプリケーションを構築しました。アプリケーションをVC6でコンパイルすると、正常に動作します。
これの理由は何でしょうか?
visual-c++ - VC8 (VS2005) から VC9 (VS2008) への移植の問題は何ですか?
私は、VC8 (VS2005) でビルドおよびテストされた非常に大規模で複雑なプロジェクト (実際には、119 の「プロジェクト」で構成される「ソリューション」であり、そのほとんどが DLL) を継承しており、それを VC9 に移植するタスクがあります。 (VS2008)。
私が使用した移植プロセスは次のとおりです。
- VC8 .sln ファイルをコピーし、名前を VC9 .sln ファイルに変更します。
- すべての VC8 プロジェクト ファイルをコピーし、名前を VC9 プロジェクト ファイルに変更します。
- すべての VC9 プロジェクト ファイル、s/vc8/vc9 を編集します。
- VC9 .sln、s/vc8/vc9/ を編集します。
- VS2008 で VC9 .sln をロードし、IDE にすべてのプロジェクト ファイルを「変換」させます。
- 適切なビルドが得られるまで、コンパイラとリンカーのエラーを修正します。
これまでのところ、最後のステップで次の問題に遭遇しました。
1) 装飾された名前の計算方法が変更され、名前が切り捨てられました。
これは単なる警告ではありません ( http://msdn.microsoft.com/en-us/library/074af4b6.aspx )。この警告でビルドされたライブラリは、他のモジュールとリンクしません。MSDN に記載されている解決策を適用することは簡単ではありませんが、実行可能でした。この問題については、「VC9 (MSVC 2008) で許可されている修飾名の長さを増やすにはどうすればよいですか?」で個別に対処しました。
2) イテレータにゼロを代入できない変更。これは仕様によるものであり、以前は許可されていたこれらのコーディング エラーを見つけて修正するのはかなり簡単でした。イテレータにゼロを代入する代わりに、値 end() を使用します。
3) for ループのスコープは、ANSI 標準に準拠するようになりました。別の簡単に修正できる問題。
4) プリコンパイル済みヘッダーに必要なスペースが増えます。場合によっては、さらに多くのスペースが必要でした。/Zm999 を使用して最大の PCH スペースを提供することになりました。PCH のメモリ使用量が再び増加した場合は、PCH を完全に使用せずに、ビルド時間の増加に耐える必要があると思います。
5) コピー ctor およびデフォルト dtor の要件の変更。テンプレート クラスでは、特定の条件下で、まだよくわかっていませんが、コンパイラはデフォルトの ctor またはデフォルトの dtor を生成しなくなったようです。これは VC9 のバグだと思いますが、他に何か間違っている可能性があります。もしそうなら、それが何であるかを知りたいです。
6) sln および vcproj ファイルの GUID は変更されませんでした。これは、私が検出できる方法でビルドに影響を与えるようには見えませんが、それでも心配です.
これらすべての問題にもかかわらず、プロジェクトは VC8 でビルド、実行、広範な QA テストに合格したことに注意してください。また、すべての変更を VC8 プロジェクトにバックポートしましたが、以前と同じように (VS2005/VC8 を使用して) ビルドして実行することができます。したがって、VC9 ビルドに必要なすべての変更は、少なくとも下位互換性があるように見えますが、回帰テストはまだ進行中です。
ここで、非常に難しい問題について説明します。VC8 プロジェクトと VC9 プロジェクトの起動シーケンスの違いに遭遇しました。このプログラムは、Andrei Alexandrescu の Book Modern C++ Designで、Loki をモデルにした小さなオブジェクト アロケーターを使用します。このアロケータは、メイン プログラム モジュールで定義されたグローバル変数を使用して初期化されます。
VC8 では、このグローバル変数はプログラム起動の最初に、モジュール crtexe.c のコードから構築されます。VC9 では、最初に実行されるモジュールは crtdll.c で、これは起動シーケンスが変更されたことを示します。起動中の DLL は、グローバル オブジェクトが統計を初期化する前にメモリの割り当てと割り当て解除を行うことで、スモール オブジェクト アロケータを混乱させているように見えます。これにより、誤った診断が行われます。プログラムの動作は実質的に影響を受けていないようですが、QA 担当者は偽の診断がそれらを通り抜けることを許可しません。
DLL をロードする前に、グローバル オブジェクトの構築を強制する方法はありますか?
他にどのような移植の問題が発生する可能性がありますか?
c++ - 異なるコンパイラ バージョンでの C++ DLL の使用
この質問は、「VS バージョン間で一貫性のある dll バイナリを作成する方法」に関連しています。
- VC6 で構築されたアプリケーションと DLL と、VC9 で構築された新しいアプリケーションがあります。VC9 アプリは VC6 でコンパイルされた DLL を使用する必要があり、そのほとんどは C で記述され、1 つが C++ で記述されています。
- C++ ライブラリは、名前の装飾/マングリングの問題により問題があります。
- いくつかの副作用があるように見えるため、VC9 ですべてをコンパイルすることは現在のオプションではありません。これらを解決するには、かなりの時間がかかります。
- C++ ライブラリを変更できますが、VC6 でコンパイルする必要があります。
- C++ ライブラリは、本質的に別の C ライブラリの OO ラッパーです。VC9-app は、いくつかの非静的関数だけでなく、いくつかの静的関数も使用します。
静的関数は次のようなもので処理できますが
非静的メソッドではそれほど簡単ではありません。
私が理解しているように、COM のようなインターフェイスを使用するというChris Becke の提案は役に立ちません。なぜなら、インターフェイス メンバー名はまだ修飾されているため、別のコンパイラで作成されたバイナリからはアクセスできないからです。私はそこにいますか?
唯一の解決策は、オブジェクトへのハンドラーを使用して C スタイルの DLL インターフェイスを作成することですか、それとも何か不足していますか? その場合、おそらく、ラップされた C ライブラリを直接使用する方が労力がかからないでしょう。
string - basic_string 使用時のエラー c2664vc++ 9.0 の abc("こんにちは")
こんにちは、Visual Studio 2008 でこのコードをコンパイルすると、次のエラーが発生します。
エラー C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)': パラメーター 1 を 'const char [12]' から ' に変換できませんstd::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
エラー C2679: バイナリ '<<' : 'std::basic_string<_Elem,_Traits,_Ax>' 型の右側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)
私が間違っているのは何ですか?
背後で起こっていることを理解するのを手伝ってくれる人はいますか? ありがとう
c++ - VC2008 での戻り値の最適化
VC2008 で使用できる RVO (戻り値の最適化) や NRVO (名前付きの戻り値の最適化) のような他の手法はありますか?
c++ - boost::variantイテレータを使用して「パラメータを変換できません」
同じタイプのオブジェクトを格納するさまざまなタイプのイテレータを使用できる関数を作成したいと思います。1つ
はstd::map
containing shared_ptr<Foo>
(typedef-ed as FooMap
)で、もう1つはstd::list
contains shared_ptr<Foo>
(FooList
)です。
私は、MSaltersが同様の質問に対して提案したソリューションが本当に好きで、イテレーターを実装しようとしましたboost::variant
。イテレーターは、関数が最初から2番目に反復するパラメーターとして取得します。
私の関数は次のようになります(かなり単純化されています):
FooIteratorと訪問者は次のように定義されます。
私はこのメールの添付ファイルから上記のほとんどを手に入れました。そのソリューションは、MSaltersの回答によると、アダプターとポリシーも使用しますが、これは少し多すぎるようです。そのため、そのコードを単純にコピーしたくありません。特に私はその一部しか理解していないので。
上記のコードを使用すると、VS2008から次のコンパイラエラーが発生します(これは合計160の最初の数行にすぎないため、ここに投稿するには少なすぎると思います。ただし、誰かが追加したい場合は、喜んで追加します。すべて見る):
私は何が間違っているのですか?