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

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

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

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

C++

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

Q&A

2回答

6667閲覧

VS2015/2017でVS2013ランタイムを使うようなDLLを作りたい

raccy

総合スコア21733

Visual Studio

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

C++

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

0グッド

0クリップ

投稿2017/04/26 10:20

###概要

C++について、コンパイラはVisual Studio 2015またはVisual Stuido 2017を使いたいのですが、最終的できるDLLはVisual Studio 2013のランタイムコンポーネントを見に行くようにすることはできるのでしょうか?

方法があれば教えて欲しいです。可能であれば、CMakeで設定する方法があればベストです。(CMakeでソリューションファイルを作っているので)

###具体的に何をしたいのか

趣味でOBS Studioというソフトのプラグインを作っています。OBS StudioはオープンソースでVisual Studio 2013でもVisual Studio 2015でもコンパイルできるのですが、配付されているバイナリはVisual Studio 2013でコンパイルされており、動作にはVisual Studio 2013ランタイムコンポーネントを入れることが必須になっています。

そこで、配付するプラグインのバイナリについても、C++のランタイムコンポーネントはVisual Studio 2013だけに依存しておけば、追加でランタイムコンポーネントと入れる必要がありません。もし、間違ってVisual Studio 2015でコンパイルしたバイナリを配付してしまったら、Issueを投げつけられます。自分の環境ではどっちのランタイムもすでに入っていて気付かなかったので、やっちまったーって感じで配布物を増やすハメになります。

では、Visual Studio 2013でコンパイルすれば良いんじゃないかと思うかも知れませんが、私はC++11やC++14の機能をもっと使いたいんです!本当に使うのか、そもそも使いこなすことができるのかは置いとくとしても、u8"ほげ"とかしたいんです。でも、VS2013の事もかんがえると制限されたModern C++にせざるを得ないという状況で、なんとかならないかなーと思っているところです。

もし、解決策があれば教えてください。そもそも無理という場合でも、それはそれで諦めが付きますので、回答があると助かります。

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

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

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

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

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

guest

回答2

0

RuntimeライブラリのDLLを使用しないようにMTにしてコンパイルするようにすればいいんじゃないでしょうか。

投稿2017/04/26 12:07

hmmm

総合スコア818

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

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

raccy

2017/04/26 12:22

それですと、Runtime分バイナリのサイズが大きくなり、再配布可能DLLを含めるのと変わり無い物になるのでは無いかと思うのですが。必要な分に限定されてそれほど大きくならないのでしょうか?
hmmm

2017/04/27 03:37

@raccy 数百KBくらいですよ。再配布のインストーラーはMFCとかも入っているからでかいです。それに比べたら全然小さいですよ。
guest

0

こんにちは。

VC++ 2015とVC++ 2017のランタイムは互換性が有るらしいですが、VC++ 2013との間には互換性は無い筈です。原則として異なるバージョンのランタイム間でやり取りが発生するとアウトです。
最大の問題は、メモリ・マネージャ境界だったと思います。
プラグインが獲得した領域をOBS Studioが解放したり、その逆があるとダメです。
dllとexeは同じコンパイラでコンパイルしておく必要はない(C++BuilderでVC++のDLLを呼ぶとかよくやってました。)ので、C言語I/Fなら結構行けるはずと思います。

逆に、C++ I/Fの場合これはかなり厳しい条件です。
例えばstd::string型データのやり取りがあっては行けないことを意味します。
つまり、OBS Studioとプラグイン間のI/FにSTLが存在する場合は断念するしかないかも知れません。

投稿2017/04/26 11:22

Chironian

総合スコア23272

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

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

raccy

2017/04/26 11:33

OBS Studioとプラグイン間のやりとりはCのI/Fオンリーなので、そういった問題はでなかったです。VC++2015のランタイムもいれておけば、VC++2015でコンパイルしたプラグインでも正常に動きました(OBS Studio本体は2013を見に行ったままです)。 でも、プラグインを使う人達はこういう方面は素人なので、VC++2015のランタイムを追加で入れさせたくないし、配布物に再配布可能なランタイムのDLLを含めたくないというのが今回の趣旨です。でも、コンパイルは2015でしたいんです。リンカ関係を無理やりいじればできるよ、みたいな情報があると嬉しいのですが。
Chironian

2017/04/26 13:09

なるほど。ということは、STLについても2013用のランタイムを使うということですね。さすがraccyさん、大胆ですね。 原理的にはシステム・インクルードをディセーブルして、VC++2013のインクルード・パスを指定し、V++2013のライブラリとリンクすれば可能な筈ですが、実際にはやってみないことには。 ダイナミック・リンクなら、メモリ・マネージャ境界は発生しないはずなので可能性はあると思います。 しかし、果たして異なるバージョンのコンパイラでビルドしたC++オブジェクト(raccyさんのプラグインと2013のSTLランタイム)をリンクできるのか?疑問です。マングルの仕様変更がないのか等、リスクは多数ありそうな印象を受けます。 個人的には、hmmmさんもおっしゃっているように静的リンクが現実的と思います。実際にサイズがどうなるのか、みてみては?
raccy

2017/04/26 14:33

MacやLinuxとかですとコンパイラとC++ランタイムであるlibc++やlibstdc++は独立して存在しているので、STLライブラリと言語機能は切り離して使えるもんじゃないのかと思った次第です。 やはり、静的リンク、ですかね…
Chironian

2017/04/26 15:06

その通りなんですけど、互換性の維持は結構たいへんですし、頑張って互換性を維持しないといけないシナリオはレアと思いますので、互換性の維持を期待するのは厳しいように感じます。 > やはり、静的リンク、ですかね… だと思います。 ああ、でも、セキュリティ・アップデートを考慮すると必ずしも静的リンクがベストではないかも。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問