連絡先 Hikwareホーム
Hikware.Tech
自分用の覚え書きをそのまま公開。参考程度にどうぞ。

VS2008 から VS2017 へのC++プロジェクト変換まとめ

公開日 2018/05/19
最終更新 2018/05/19
  • Visual C++ 2008 expless のプロジェクトを Visual Studio 2017 で読み込んだ時に必要になった変更点の覚え書き。

プロジェクト設定ファイルが .vcproj から .vcxproj に変わってる

 古い .vcproj は残したまま同じ内容の .vcxproj が作られるので、変換後に問題がないなら、元の .vcproj と、ユーザー別設定の .vcproj.*.user は消してOK。

リンクエラー「LNK2026: モジュールは SAFESEH イメージには安全ではありません」

 以下のサイトに詳しい説明があるけど、ざっくり言うと、最近の Visual Studio では、脆弱性対応のため、アプリ及びライブラリのビルド時にリンカオプションに /SAFESEH オプションを付けるのがデフォルトになったが、それなしでビルドされたライブラリが含まれてるから対応しろと。

 自前でビルドできるライブラリならライブラリプロジェクトも変換してビルドしなおせばいいし、無理ならアプリプロジェクトの リンカの詳細設定の 「安全な例外ハンドラーを含むイメージ」 を 「いいえ (/SAFESEH:NO)」 にすればビルドは可能。もちろん脆弱性は抱えたままになるけど。

リンクエラー「LNK2001: 外部シンボル "_printf" は未解決です」

 これまた以下のサイトに詳しい説明があるけど、今はこれらの関数はインライン化されていて実体が存在してないので、古い Visual Studio でビルドしたライブラリをリンクするとこのエラーが出る。

 なのでこれも、自前でビルドできるライブラリならビルドしなおせば解決するし、無理ならアプリプロジェクトの リンカの入力に「legacy_stdio_definitions.lib」を追加 すればとりあえずは回避できる。

ビルド後イベントで exe を別フォルダにコピーしていたのが、今さら構文エラーとか怒られた

 以前からビルド後イベントに、

copy $(TargetPath) $(ProjectDir)..\root 

などと書いていたのだが、急に「コマンドの構文が誤っています」とか怒られた。最近の Visual Studio ではクォーテーションで囲まないとダメらしい。

copy "$(TargetPath)" "$(ProjectDir)..\root" 

 それと、$(TargetPath)$(ProjectDir) の内容にスラッシュでのパス区切りが含まれてる場合も、昔は動いてたけど今はエラーになるぽい。これは Visual Studio というより Windows10 のシェルのせいかもしれんけど。