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

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

新規登録して質問してみよう
ただいま回答率
85.50%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

C++

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

Q&A

2回答

10305閲覧

ランタイムライブラリ(/MD, /MDd)によってDLLを分けたくない

irfm

総合スコア6

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

C++

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

0グッド

0クリップ

投稿2015/04/30 03:12

以下環境にて、開発者向けのDLL(例えばFFTモジュールのような)を
作成しようとしていますが、ランタイムライブラリの設定で躓いています。
開発環境、条件:
・Win7 64bit, VC++2010
・標準 Windows ライブラリを使用する
・ATLを使用しない
・共通言語ランタイムサポートを使用しない
・ソースコードは配布しない

DLL作成にあたり調査した所、下記(1)(2)の制約があると認識しています。

(1)メモリ確保手段が異なるため、/MD, /MDdの混在はできない。
(例:APP側/MDd, DLL側/MDは不可)

(2)デバッグバージョンのアプリケーションは配布できない。
https://msdn.microsoft.com/en-us/library/8kche8ah(v=vs.100).aspx

DLL使用者がリリースモード(/MD)で開発する分には問題ありませんが、
デバッグモード(/MDd)で開発を進めるような状況も考えられます。
しかしながら(2)の制約により、/MDdでコンパイルしたDLLは配布できません。
何か対処法は無いでしょうか。
ex)
・上記条件を変更すれば、コンパイラオプションによらないDLL作成ができる
・そもそも(1)(2)の解釈がおかしい
・そもそもソースコードがおかしい

#情報不足でしたらすみません。補足致します。

以下に最小限のソースを記載します。
DLL.dllをAPP.exeから呼び出す想定です。

DLL.h

lang

1#define WIN32_LEAN_AND_MEAN 2#define DLL_EXPORT __declspec(dllexport) 3 4#include <SDKDDKVer.h> 5#include <windows.h> 6#include <iostream> 7#include <vector> 8 9extern "C" {DLL_EXPORT int DllFunc(std::vector<double>& a);} 10

DLL.cpp

lang

1#include "DLL.h" 2int DllFunc(std::vector<double>& a){ 3 return a[2]; 4}

APP.cpp

lang

1#include "DLL.h" 2#include <stdio.h> 3#include <windows.h> 4 5typedef int (*Func)(std::vector<double>& a); 6 7int main(){ 8 std::vector<double> a(10); 9 for (int i = 0; i < 10; i++) a[i] = i; 10 11 HMODULE hmod = LoadLibraryA("DLL.dll"); 12 if (hmod == NULL) return 1; 13 14 Func func = (Func)GetProcAddress(hmod, "DllFunc"); 15 if (func == NULL) return 2; 16 17 int ret = func(a); 18 19 FreeLibrary(hmod); 20 return 0; 21}

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

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

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

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

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

guest

回答2

0

実際にどのような問題が発生しているか書かれていませんので、よくあるデバッグモードとリリースモード間のメモリ確保&解放の際にアクセス違反になる問題だと推測しますが、いかがでしょうか。
だとしたら、DLL側の関数のインターフェースを変更するしかないと思います。
回りくどいようですが、
0. APP側から指定されたサイズの配列をDLL側で確保する関数
0. DLL側で何らかの処理を行う関数(DllFunction()の処理に相当)
0. APP側からDLL内に確保した配列を開放する関数
と3種類を用意して、APP側で処理を呼び出す際に、これらを使用してメモリ確保&解放をしてもらうようにする。ことで回避できると思います。

投稿2015/04/30 06:02

KoichiSugiyama

総合スコア3041

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

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

irfm

2015/04/30 06:34

ご回答有難うございます。 ご推察の通り、DebugとReleaseのメモリ確保に関する問題と捉えています。 上述のソースコードで、 APP側:/MD、DLL側:/MDまたはAPP側:/MDd、DLL側:/MDd であれば問題は発生しません。 APP側:/MDd、DLL側:/MD とコンパイルすると、DLLでは異なる値が参照されます。 /MDdでコンパイルしたDLLはライセンス上渡せないのでどうすれば・・という質問でした。 Debugでnewすると余分な情報まで保持するので、Releaseでは開放できない(または逆)ことは承知していましたが、参照するのもダメなのですね。 質問に記述した前提条件が正しければ、 ご教示頂いた通りDLLに確保させるのが最短ルートな気がします。
guest

0

間違っていたら申し訳ないですが、、、

(2)デバッグバージョンのアプリケーションは配布できない。

というのは聞いたことが無かったのですが、

「Debug versions of applications and the various Visual C++ DLLs are not redistributable.」

これのことでしょうか?

であれば、これは「自分がコンパイルしたアプリ、DLL」ではなく、「VC++の」ではないのでしょうか?

そうで無ければ私はおもいっきりライセンス違反していますね。

私に限らず、たとえば
https://www.qt.io/download-open-source/#section-2
とか、
普通にVCのデバッグビルドDLLを公開しているOSSは大量にありますので。

単純に、デバッグ用のVCランタイムは禁止だが、あなたが作ったデバッグビルドの
実行ファイルは公開しても良いのではないでしょうか。

投稿2015/05/20 13:43

fkhideaki

総合スコア19

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

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

irfm

2015/05/26 07:55

回答ありがとうございます。コメント遅くなりすみません。 挙げて頂いた例は、確かにDebug版を配布していますね・・。しかもQTなんて色んなところで使われていますよね。また、Debug版を公開している個人の方もいらっしゃいますね。 私も色々と検索してみたのですが、皆様色んな解釈をされていて混乱しています。 今更ですが、折を見てMicrosoftに質問してみたいと思います。(答えてくれるのか・・)
fkhideaki

2015/05/26 23:41

なるほど。 前回投稿でほぼ正解では無いかと思っていましたがなかなか難しい問題かもしれませんね。 一応補足ですが、 私の英語力に問題がある可能性もありますので、日本語版を見てみますと https://msdn.microsoft.com/ja-jp/library/8kche8ah.aspx ・Visual Studio に含まれているすべてのファイルを再配布することはできません。 ・アプリケーションの デバッグ バージョンと、 ・各種の Visual C++ DLL は、再配布できません。 禁止が明示されているのは、上記3つだけのようですね。 知りませんでしたが、少なくともデバッグ版の実行ファイルは配布してはならないようですね。 ですが、やはりデバッグ版ライブラリを配布するな、とは書かれていません。 後一点問題は、この資料の"アプリケーション"が指す内容が、DLLを含むかどうかでしょうか。 他の資料ですが、 https://msdn.microsoft.com/ja-jp/library/d1587c1h.aspx 「アプリケーションと DLL の違い」として、冒頭に次のように書かれています。 「 DLL とアプリケーションは、どちらも実行可能なプログラム モジュールですが、いくつかの相違点があります。 」 やはりマイクロソフトとしては、 ・「アプリケーション」と「DLL」は別のものである ・それらのようなものを総称する場合は「プログラム モジュール」と呼ぶ という単語の定義になっているようですので、やはりデバッグ版DLLは配布しても問題ないかと思います。 結局核心を得る情報がなくてすみません。 ですが、ここまで説明が不鮮明であれば、万が一デバッグ版DLLを配布したことを訴えられても問題ないんじゃないかという気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問