実行ファイルにDLLファイルを同梱する方法とは?

このQ&Aのポイント
  • EXEにDLLファイルを同梱する方法を解説します。
  • 開発環境はC++でOPENCVを使っています。開発ソフトはMicrosoft Visual Studio Express 2013 for Windows Desktopを使っています。
  • MSVCP120.dllがないため、プログラムを開始できませんと表示される原因について考えます。
回答を見る
  • ベストアンサー

実行ファイルにDLLファイルを同梱したいです。

http://kidd0320.hatenablog.com/entry/2014/06/06/142355 EXEにDLLファイルを同梱するためこちらのサイトを参考にしたのですが、ソフトを別のパソコンに入れたところ”MSVCP120.dllがないため、プログラムを開始できません。” と表示されてしまいます。 開発環境はC++でOPENCVを使っています。 開発ソフトはMicrosoft Visual Studio Express 2013 for Windows Desktopを使っています。 構成はReleaseでプラットフォームはwin32です。 インクルードファイルなどは以下のとおりです。 #include "stdafx.h" #include <stdio.h> #include <windows.h> #define snprintf _snprintf #include <opencv/highgui.h> #include <iostream> #include<fstream> using namespace std; どういった原因が考えられるでしょうか。 どなたかご教授いただけないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

> プロパティを変更し、ビルドしたものを別のPCにいれて検証すると、メッセージが表示されてしまいます。 OpenCVがDLLを欲しがってるんじゃないかしら? static-libraryをリンクしましたか?

その他の回答 (4)

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.4

> DLLの表示がない項目を両方試したのですがだめでした。 もしかしてですが、参考にされたページでもそうですが、ほかで見つけたページでも MSVCR120.dll が見つからないエラーの場合は、マルチスレッドの設定で回避できると説明がありました。 MSVCP120.dllはNo1さんが紹介しているページで「C++ 再頒布可能パッケージ」を入れないとだめなのかもしれませんね。

回答No.3

DLLを同梱させたいの? DLLなしで実行できるようにしたいの? 前者なら配布パッケージを拾ってくる。 後者ならプロパティを変更する。

rararamuijin
質問者

補足

後者です。プロパティを変更し、ビルドしたものを別のPCにいれて検証すると、メッセージが表示されてしまいます。開発側のパソコンではVisual Studioは外付けHDDに入れています。

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.2

画像ではマルチスレッドDLLの時の画面になっていますが、説明ではその部分を「マルチスレッドDLLじゃないもの」に設定すると説明されています。そのように設定したのでしょうか。

rararamuijin
質問者

補足

プロパティを変更し、ビルドしたものを別のPCにいれて検証すると、メッセージが表示されてしまいます。開発側のパソコンではVisual Studioは外付けHDDに入れています。DLLの表示がない項目を両方試したのですがだめでした。

回答No.1

> どういった原因が考えられるでしょうか。 どうもこうもありません、 ”MSVCP120.dllがないため、プログラムを開始できません。” です。 MSVCP120.dllは再配布パッケージに含まれるはず。

参考URL:
https://www.microsoft.com/en-us/download/details.aspx?id=40784&wa=wsignin1.0

関連するQ&A

  • EXEにDLLファイルを同梱したいです。

    http://kidd0320.hatenablog.com/entry/2014/06/06/142355 EXEにDLLファイルを同梱するため、こちらのサイトを参考にしたのですが、ソフトを別のパソコンに入れたところ”MSVCP120D.dllがないため、プログラムを開始できません。” と表示されてしまいます。 開発環境はC++でOPENCVを使っています。 開発ソフトはMicrosoft Visual Studio Express 2013 for Windows Desktopを使っています。 構成はReleaseでプラットフォームはwin32です。 どうすればよいでしょうか。 どなたかご教授いただけないでしょうか。

  • ファイルの読み込みと書き込み

    はじめまして。 最近プログラムを勉強し始めたのですが、ファイルの書き込みと 読み込みで行き詰ってしまいました。 ファイルAで演算したものをファイルBで読み込み表示したいと思い、 以下のようなプログラムを作成したのですが、エラーが出てしまいます。 かなり初歩的なこととは思いますが、アドバイスをお願いします。 【ヘッダファイル(stdafx.h)】 #include <stdio.h> #include <tchar.h> #include <fstream> #include <iostream> 【ソースファイルA】 #include "stdafx.h" using namespace std; int main() { int a; cout << "数値入力:" ; cin >> a; a = a * 2; ofstream fout("sample.txt"); fout << a; fout.close(); return 0; } 【ソースファイルB】 #include "stdafx.h" using namespace std; int main() { ifstream fin("sample.txt"); fin >> a;     fin.close(); int b; b = a; cout << "結果 = " << b << '\n'; return 0; }

  • snprintfが使用できない。

    つい先週ビルドできたプログラムがビルドできなくなりました。 ビルドの状況を見ると、 1>------ すべてのリビルド開始: プロジェクト: disp, 構成: Debug Win32 ------ 1>プロジェクト 'disp'、構成 'Debug|Win32' の中間出力ファイルを削除しています。 1>コンパイルしています... 1>pgm.cpp 1>c:\opencv2.1\include\opencv\cvcompat.h(52) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(55) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(58) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(61) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(64) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(67) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(70) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(73) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(76) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\opencv2.1\include\opencv\cvcompat.h(79) : error C3861: 'snprintf': 識別子が見つかりませんでした 1>c:\documents and settings\st\デスクトップ\cd_r\01capture\01disp\pgm\pgm.cpp(23) : error C2731: 'main' : 関数はオーバーロードできません。 1> c:\documents and settings\st\デスクトップ\cd_r\01capture\01disp\pgm\pgm.cpp(22) : 'main' の宣言を確認してください。 1>ビルドログは "file://c:\***\disp\pgm\Debug\BuildLog.htm" に保存されました。 1>disp - エラー 11、警告 0 ========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ========== との出力が・・・・・・ どうすれば、このエラーはなくなるのでしょうか? 環境は Visual C++ 2008 Express Edition Windows Vista Business OEMAct です。

  • C++でのファイル入出力について

    C++で計算したデータを何かファイルに保存しようとしています。 #include<iostream> #include<fstream> using namespace std; int main() { ofstream fout("test0.txt");     //ここで処理をしてファイルに書き込む作業を行う fout.close(); return 0; } 以上のようなサンプルがあったすると、ファイルはカレントディレクトリ に保存されますよね。 そのファイルの保存先を指定するようにするにはどうしたらいいですか? よろしくお願いします。

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

  • opencv1.1の実行について(初心者です)

    こんばんは。 opencvを現在勉強しています。プログラムをデバックしようとすると以下の文章がでてきてうまくデバックできません。 「kamera.exe の 0x10012c5d (highgui110.dll) で初回の例外が発生しました: 0xC0000005: 場所 0x719b3856 を読み込み中にアクセス違反が発生しました。」 http://stackoverflow.com/questions/820002/unhandled-exception-at-0x10012c5d-highgui110-dll こちらの質問サイトで同じ質問をされている方がいるのですが、回答が英語で何を言ってるのかわかりません。 opencv1.1、VC++2008を使っております。 OSはXPです。 環境変数のパスの設定 インクルードファイルの設定 ライブラリファイルの設定 追加の依存ファイルの設定 はできていると思います。 またVC++2005の再配布パッケージもインストールしています。 またopencv1.1に付属しているサンプルプログラムはちゃんと動くようです。 正直どうしていいか途方に暮れています(゜_゜;) お分かりになる方いらっしゃれば御教授願えないでしょうか?

  • Windows7 64bit でOpenCV2.1を動かしたい

    Windows7 64bit でOpenCV2.1を動かしたい Windows7 64bit visualstadio2005 でopencv2.1を動かしたいのですがreleaseだと動くのにdebugだとうまく動きません。 ネットの入門ページを参照にして インクルードファイルに C:\OpenCV2.1\include ライブラリファイルに C:\OpenCV2.1\lib C:\OpenCV2.1\bin を追加しました。 プラットフォームはよくわからなかったのでwin32とx64の両方に入れてみました また、環境変数もインストールの時点できちんと入っていることは確認しました。 また、プロジェクトのプロパティ→リンカ→入力→追加依存のファイルにも 構成がdebugのときに cv210d.lib cxcore210d.lib cvaux210d.lib highgui210d.lib releaseのときに cv210.lib cxcore210.lib cvaux210.lib highgui210.lib としています。 また、コード部分に #include "cv.h"と入力してもエラーが出るので #include <C:\OpenCV2.1\include\opencv\cv.h> とすることで対応している状況です。 どうすればうまく動くようになるでしょうか? もしよろしければ回答お願いします

  • ファイルからのデータ入力

    ファイルから数字を読み取って最初の5文字だけを 出力するプログラムのつもりなんですが、動きません。 VC++6.0で、OSはwin2kです。 ファイルの終わりをどう検出するかの問題だと思いますが、 よく分かりません。教えていただけると助かります。 #include <stdio.h> #include <cstdlib> #include <fstream.h> #include <iostream.h> #include <vector> using namespace std; void main(){ FILE *f; f=fopen("dat.txt","r"); vector <int> a; int b,c; while((c=fscanf("f","%d\n",b))!=EOF){ fscanf("f","%d\n",b); a.push_back(b); } for(int i=0;i<5;i++){ printf("%d",a[i]); } fclose(f); }

  • DLLの明示的な読み込みの方法

    開発環境:WindowsXP sp2 + VisualStudio2005 MSDNやその他のWebページで、DLLの明示的なロードについて勉強しています。 試しに以下のようなコードを書いてみたのですが、コンパイルは通りますが、実行時にDLLが読み込まれているのにもかかわらず、関数のアドレスが取得できません。 ---DLLのコード--- #include <iostream> using namespace std; __declspec(dllexport) void printMessage() { cout<<"printMessage関数が呼ばれた"<<endl; } ---終わり--- コンパイルしたDLLのみをDLLを使用した実行形式がコンパイル後に収納されるフォルダに移動して、以下のコードを書いてコンパイルしました。 ---EXEのコード--- #include <windows.h> #include <iostream> typedef void(*TFUNC)(); int main(void) { HINSTANCE hInstDLL; TFUNC DllFunction; //DLLの読み込み hInstDLL=LoadLibrary(L"dll.dll"); if(hInstDLL==NULL) { std::cout<<"ERROR"<<std::endl; return 0; } //printMessage関数のアドレスを取得 DllFunction=(TFUNC)GetProcAddress(hInstDLL,"printMessage"); //この辺りがおかしいかも知れない //関数の使用 if(DllFunction==NULL) { std::cout<<"ERROR"<<std::endl; FreeLibrary(hInstDLL); return 0; } DllFunction(); //DLLの解放 if(!FreeLibrary(hInstDLL)) return 0; return 0; } ---終わり--- DLLは見つかる物の、どうも上手くいかないようです......原因は何なのでしょうか。

  • DLL作成時、defファイルを使いたくない

    また質問させて下さい。 Visual Studio2005でDLLを使ったプログラムを作ろうとしています。 defファイルを利用すると、そのDLLファイルを作成できるのですが、 __declspec(dllexport)を利用すると、DLLファイルのその関数を読めなくなってしまいます。 なぜでしょうか? 下記は、MFCで、dll_test7というプロジェクトを作り、そのdll_test7.hのコードのすぐ下に その関数を書きました。(これがダメだと思うのですが…) //●Visual Studioのプロジェクト作成で、生成される部分 // dll_test7.h : dll_test7.DLL のメイン ヘッダー ファイル // #pragma once __declspec(dllexport) void __cdecl test0(void); #ifndef __AFXWIN_H__ #error "PCH に対してこのファイルをインクルードする前に 'stdafx.h' をインクルードしてください" #endif #include "resource.h" // メイン シンボル // Cdll_test7App // このクラスの実装に関しては dll_test7.cpp を参照してください。 // class Cdll_test7App : public CWinApp { public: Cdll_test7App(); // オーバーライド public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() }; //■作成した関数 __declspec(dllexport) void __cdecl test0(void) { CString cs; cs="aa"; ::AfxMessageBox(cs); } 上記は、defファイルを利用するとこの関数を呼び出せます。 以上、どうぞよろしくお願い致します。