質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

11254閲覧

VS2015でC++/CLIを使う時標準ライブラリが使えない

FancyOrFail

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/03/12 14:44

自作でSTGゲームを作ろうとしているのですが、コンパイルする時のバグの発生で開発開始直後の状態から全く進んでいません。

Visual Studio 2015 Communityで、C++/CLIとDXライブラリを使い開発しているのですが、標準ライブラリを使用すると(正確にはincludeすると)、以下の様なバグが出てコンパイル出来ません(前者はDebugビルド、後者はReleaseビルドの時です)。

  • LNK2038 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'Main.obj' と一致しません。
  • LNK2038 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MD_DynamicRelease の値 'Main.obj' と一致しません。

また、

  • #include <string> //リンカエラー発生
  • #include <iostream> //リンカエラー発生
  • #include <stdio.h> //エラー発生せず
  • #include "DxLib.h" //エラー発生せず

となることから、C++標準ライブラリでのみ発生すると推測されます。

この問題について色々と調べていき、コンパイルのスイッチに/MDdや/MDでなく、/MTdや/MTを使用するとこのバグが起きないと分かったのですが、C++/CLIを使用している時は/MTdや/MTは使えないのでどのように対処すればいいのか一切見当が付かない状態です。対処法がないのならばネイティブのC++での開発に切り替えようと思うのですが、もし対処法があるのならばお教え頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

VS2015でC++/CLIを使う時標準ライブラリが使えない

C++/CLIにはそのような制限はありませんので、そのタイトルはふさわしくないですね。

C++/CLIでは/MTと/MTdは選択できないので、/MTと/MTd版しかないDXライブラリはそのままでは使えません。こればかりはそういう仕様なのでどうしようもありません。

DXライブラリのサイトを見てみましたが、ソース(プロジェクト一式)も提供しているので、自分で/MDと/MDd版のDXライブラリをビルドしてしまうのが一番簡単かと思います。そうしない(できない)場合は、あきらめてネイティブC++での開発に移行するのが無難だと思います。


追記
サイトをよく見たらC#(.NET)向けのライブラリも提供してますね。C++/CLIならそっちが使えるかもしれません。

あるいは、もう一つの方法としては、DXライブラリの関数群を単純に呼び出すだけのDLLを作るという方法があります(いわゆるラッパーDLL)。C#向けのライブラリはこの手法で作っているようです。

ラッパーDLLは、ネイティブC++でコンパイルオプションを/MT,/MTdにしてビルドします。DLL呼び出しなら必ずしもコンパイルオプションを一致させる必要はありません。データの受け渡しにSTLコンテナなどが使われているとコンパイルオプションの不一致でトラブルが発生することがありますが、DXライブラリでは使われていないので大丈夫です。

投稿2016/03/12 15:57

編集2016/03/13 04:05
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FancyOrFail

2016/03/13 13:18

DXライブラリがMTやMTdに対応していないのが原因だと特定できました。#includeからDXライブラリ関連を全てはずし、標準ライブラリをincludeさせた状態でコンパイルしたところ正常にコンパイルできました。 追記について、DXライブラリの.NET版はC++用ソースを機械的に変換したもののようで、過去にC#とDXライブラリ.NET版を使用してみた時にあまりC#の仕様に合っていないと感じC++/CLIにしようとしたのですが、C++/CLIで使用するのなら恐らくC#の時のように使いにくいということはあまりないかもしれません。 DXライブラリをコンパイルし直すか、.NET版を使用するかどちらかを検討しようと思います。丁寧な回答ありがとうございました。
guest

0

こんにちは。

たまたま手元にC++/CLIでWindows Formのお試し用プロジェクトがあったので、やってみました。
<string>, <iostream>両方共リンカ・エラーは発生しませんでした。
プロジェクトのプロパティは/MDdでした。
ほぼ素のプロジェクトです。

MyForm.hの#pragma onceの直後で#includeしています。
Visual Studio 2015 update1です。

それと同様な問題がネイティブのC++で発生した記憶がありますが...う~ん、原因を思い出せません。
プロジェクトの設定はデバッグ用とリリース用が異なります。デバッグモードでビルドできるようにしている時にリリース用の設定をいろいろ変更してたような、そんなマヌケっぽい苦労だったような記憶が薄っすらとあります。

投稿2016/03/12 15:05

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FancyOrFail

2016/03/12 15:16

そうですね…#includeの順序を変えたり色々とソース自体を変えても治る気配はないのでやはり設定だと思いますが… どのような設定を変更すればいいのでしょうか…。
Chironian

2016/03/12 23:33

catsforepawさんの回答を見て気が付きました。 DXライブラリは/MTでビルドされているのですね。/MTと/MDの混在はできないので、そのようなエラー・メッセージが出ているということです。 catsforepawさんの回答通り、頑張ってDXライブラリを/MDでビルドするか、ネイティブC++で開発するのどちらかだろうと思います。 UI部分が結構たいへんになるのですが、中々現状では良い解がありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問