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

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

ただいまの
回答率

89.12%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 6,110

irfm

score 7

以下環境にて、開発者向けの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
#define WIN32_LEAN_AND_MEAN
#define DLL_EXPORT __declspec(dllexport)

#include <SDKDDKVer.h>
#include <windows.h>
#include <iostream>
#include <vector>

extern "C" {DLL_EXPORT int DllFunc(std::vector<double>& a);}
DLL.cpp
#include "DLL.h"
int DllFunc(std::vector<double>& a){
    return a[2];
}

APP.cpp
#include "DLL.h"
#include <stdio.h>
#include <windows.h>

typedef int (*Func)(std::vector<double>& a);

int main(){
    std::vector<double> a(10);
    for (int i = 0; i < 10; i++) a[i] = i;

    HMODULE hmod = LoadLibraryA("DLL.dll");
    if (hmod == NULL) return 1;

    Func func = (Func)GetProcAddress(hmod, "DllFunc");
    if (func == NULL) return 2;

    int ret = func(a);

    FreeLibrary(hmod);
    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/30 15:34

    ご回答有難うございます。
    ご推察の通り、DebugとReleaseのメモリ確保に関する問題と捉えています。

    上述のソースコードで、
    APP側:/MD、DLL側:/MDまたはAPP側:/MDd、DLL側:/MDd
    であれば問題は発生しません。

    APP側:/MDd、DLL側:/MD
    とコンパイルすると、DLLでは異なる値が参照されます。
    /MDdでコンパイルしたDLLはライセンス上渡せないのでどうすれば・・という質問でした。

    Debugでnewすると余分な情報まで保持するので、Releaseでは開放できない(または逆)ことは承知していましたが、参照するのもダメなのですね。

    質問に記述した前提条件が正しければ、
    ご教示頂いた通りDLLに確保させるのが最短ルートな気がします。

    キャンセル

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/26 16:55

    回答ありがとうございます。コメント遅くなりすみません。
    挙げて頂いた例は、確かにDebug版を配布していますね・・。しかもQTなんて色んなところで使われていますよね。また、Debug版を公開している個人の方もいらっしゃいますね。

    私も色々と検索してみたのですが、皆様色んな解釈をされていて混乱しています。
    今更ですが、折を見てMicrosoftに質問してみたいと思います。(答えてくれるのか・・)

    キャンセル

  • 2015/05/27 08: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を配布したことを訴えられても問題ないんじゃないかという気がします。

    キャンセル

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる