トップページ > 過去ログ > 記事閲覧
Dxライブラリを使用して独自ライブラリを作成したいのですが
名前:Mikan 日時: 2009/05/23 23:21

Dxライブラリの関数などを使用して独自のライブラリを作成したいのですが、上手くいきません。 仮にこのようなアニメーションを表示するクラスを入れたライブラリなどを作りたいと思っています。 #ifndef ANIME_H #define ANIME_H #include "DxLib.h" #define MAX_IMAGE 20 //イメージ保持の最大数 typedef struct{ int img[MAX_IMAGE]; //イメージハンドル int spd, max; //アニメーションスピードと、1アニメーションの最大枚数 int no; //アニメーションナンバー int bright; //光度 bool oneTimeFlag; //一度のアニメーション int cnt; //カウンター }animeData_t; class Anime{ animeData_t aniDat; public: Anime(); ~Anime(); void setDat(animeData_t); //アニメデータセット animeData_t *getDat(); //アニメデータ取得 void oneTimeSet(int _no); //1タイムアニメーションセット //画像描画 void draw(int _x, int _y, double _exRate = 0, double _angle = 0); }; #endif 環境は OS:WindowsXP コンパイラ:VC++9.0EE まだライブラリを一度も作ったことは無いのですが、Dxライブラリの関数をはずすと上手くいきましたので、設定が上手くいってないと思っているのですが。 よろしくおねがいします

Page: 1 |

Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.1 )
名前:憂煉 日時:2009/05/24 09:56

上手くいかない。とありますが、どのように上手くいかないのでしょうか? コンパイルに失敗する。描画結果がおかしい。呼び出した瞬間に強制終了する。等等 一重に上手くいかないと書かれましても範囲が広すぎるので、的確な回答をする事は難しいかもです。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.2 )
名前:Mikan 日時:2009/05/24 21:41

>>憂煉さん 回答ありがとうございます。 どのように上手くいかないのかといいますと、コンパイルに失敗してしまいます。 コンパイルエラーの内容は下記のとおりです。 libcmtd.lib(crt0dat.obj) : error LNK2005: __cexit は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(crt0dat.obj) : error LNK2005: __amsg_exit は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(_fpinit_.obj) : error LNK2005: __fltused は既に a previous module で定義されています。 libcmtd.lib(_fpinit_.obj) : error LNK2005: __ldused は既に a previous module で定義されています。 libcmtd.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(tidtable.obj) : error LNK2005: __encoded_null は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(typname.obj) : error LNK2005: ___clean_type_info_names_internal は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(crt0init.obj) : error LNK2005: ___xi_a は既に MSVCRT.lib(cinitexe.obj) で定義されています。 libcmtd.lib(crt0init.obj) : error LNK2005: ___xi_z は既に MSVCRT.lib(cinitexe.obj) で定義されています。 libcmtd.lib(crt0init.obj) : error LNK2005: ___xc_a は既に MSVCRT.lib(cinitexe.obj) で定義されています。 libcmtd.lib(crt0init.obj) : error LNK2005: ___xc_z は既に MSVCRT.lib(cinitexe.obj) で定義されています。 libcmtd.lib(winxfltr.obj) : error LNK2005: ___CppXcptFilter は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(mlock.obj) : error LNK2005: __lock は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(mlock.obj) : error LNK2005: __unlock は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 libcmtd.lib(frame.obj) : error LNK2005: ___FrameUnwindFilter は既に MSVCRT.lib(MSVCR90.dll) で定義されています。 MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) は既に libcmtd.lib(typinfo.obj) で定義されています。 MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) は既に libcmtd.lib(typinfo.obj) で定義されています。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_execute_transformation が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_execute が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_adjust_parameters が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jtransform_request_workspace が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _jcopy_markers_setup が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _write_stdout が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_stdin が関数 _main で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _read_scan_script が関数 _parse_switches で参照されました。 libjpeg_d.lib(jpegtran.obj) : error LNK2019: 未解決の外部シンボル _keymatch が関数 _parse_switches で参照されました。 D:\xxxxx\ライブラリテスト\Debug\test.dll : fatal error LNK1120: 外部参照 9 が未解決です。 よろしくおねがいします。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.3 )
名前:Will 日時:2009/05/25 09:48

DXライブラリ 使い方説明はすべて読まれましたか? たぶん、以下の設定が間違っているのではないでしょうか? >  F ダイアログ右側に表示されている『ランタイム ライブラリ』の項目を今度は >     『マルチスレッド(/MT)』に変更します。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.4 )
名前:Mikan 日時:2009/05/25 15:50

>>Willさん 回答ありがとうございます >  F ダイアログ右側に表示されている『ランタイム ライブラリ』の項目を今度は >     『マルチスレッド(/MT)』に変更します。 上記の設定は変えておらず、設定を変更しました。 設定変更後ビルドすると、下記エラーメッセージが出てしまいました。 まだどこかに設定ミスがあるのでしょうか? 1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------ 1>コンパイルしています... 1>cl : コマンド ライン error D8016 : コマンド ライン オプション '/MTd' と '/clr' は同時に指定できません よろしくおねがいします。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.5 )
名前:Mikan 日時:2009/05/25 16:01

連続投稿すみません。 エラーメッセージに出ている、 「コマンド ライン オプション '/MTd' と '/clr' は同時に指定できません」 を元に、/clrがプロジェクトの構成プロパティ→全般 で、共通言語ランタイム サポート (/clr)とされていることがわかったのですが、この設定をどれに変えても、同時指定はできませんと出力されます。 また、サポートを使用しないに設定すると 1>------ ビルド開始: プロジェクト: test, 構成: Release Win32 ------ 1>コンパイルしています... 1>Stdafx.cpp 1>コンパイルしています... 1>AssemblyInfo.cpp 1>.\AssemblyInfo.cpp(3) : error C2871: 'System' : この名前を指定された名前空間は存在しません。 1>.\AssemblyInfo.cpp(4) : error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。 1>.\AssemblyInfo.cpp(4) : error C2871: 'Reflection' : この名前を指定された名前空間は存在しません。 1>.\AssemblyInfo.cpp(5) : error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。 1>.\AssemblyInfo.cpp(5) : error C2871: 'CompilerServices' : この名前を指定された名前空間は存在しません。 1>.\AssemblyInfo.cpp(6) : error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。 1>.\AssemblyInfo.cpp(6) : error C2871: 'InteropServices' : この名前を指定された名前空間は存在しません。 1>.\AssemblyInfo.cpp(7) : error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。 1>.\AssemblyInfo.cpp(7) : error C2871: 'Permissions' : この名前を指定された名前空間は存在しません。 1>.\AssemblyInfo.cpp(14) : error C2337: 'AssemblyTitleAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(15) : error C2337: 'AssemblyDescriptionAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(16) : error C2337: 'AssemblyConfigurationAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(17) : error C2337: 'AssemblyCompanyAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(18) : error C2337: 'AssemblyProductAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(19) : error C2337: 'AssemblyCopyrightAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(20) : error C2337: 'AssemblyTrademarkAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(21) : error C2337: 'AssemblyCultureAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(34) : error C2337: 'AssemblyVersionAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(36) : error C2337: 'ComVisible' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(38) : error C2337: 'CLSCompliantAttribute' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(40) : error C2337: 'SecurityPermission' : 属性が見つかりません。 1>.\AssemblyInfo.cpp(40) : error C2653: 'SecurityAction' : 識別子がクラス名でも名前空間名でもありません。 1>.\AssemblyInfo.cpp(40) : error C2065: 'RequestMinimum' : 定義されていない識別子です。 1> 引用符 ("") が 'RequestMinimum'? の周りにありません 1>test.cpp 1>c:\program files\microsoft visual studio 9.0\smartdevices\sdk\pocketpc2003\include\stdlib.h(1040) : error C2065: '_JBLEN' : 定義されていない識別子です。 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winnt.h(3019) : error C2146: 構文エラー : ';' が、識別子 'ContextRecord' の前に必要です。 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winnt.h(3019) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winnt.h(3019) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(1481) : error C2146: 構文エラー : ';' が、識別子 'LPCONTEXT' の前に必要です。 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(1481) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(1481) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(2222) : error C2061: 構文エラー : 識別子 'LPCONTEXT' 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(2230) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(2230) : error C2143: 構文エラー : ',' が '*' の前にありません。 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\excpt.h(56) : error C2040: 'PCONTEXT' : '_CONTEXT *' は 'int' と間接操作のレベルが異なります。 1>C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\excpt.h(59) : error C2378: 'LPCONTEXT' : 再定義されています。シンボルは typedef でオーバーロードできません 1> C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\PocketPC2003\Include\winbase.h(1481) : 'LPCONTEXT' の宣言を確認してください。 ・ ・ ・ ・ など長いエラーが出てしまいました。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.6 )
名前:Will 日時:2009/05/25 17:45

過去ログにもありますがVS2005からMT(MTd)とCLRは同時に使用することができなくなっています。 DXライブラリはネイティブC++の使用を前提としているため .netとは非常に相性が悪いです。 そのため、対策は以下の二つです 1.C++/CLI(.net)は使用しない 2.DXライブラリの全DLLを/MD(MDt)でビルドしなおす 私がやったことはありませんが、2は過去ログを見る限り一応は可能なようです。 (かなり古いログなので今でも可能かはわかりません) ただ、2はビルド環境を作るだけでもかなりの手間のようですので DXライブラリをどうしても使いたいのであれば1かと思います。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.7 )
名前:Mikan 日時:2009/05/25 22:22

>>Willさん 回答ありがとうございました。 私は開発環境に対する知識がとぼしく、どちらにしても難しそうですね^^; Willさんの教えてくれた1と2の方法を使用するにしても、もう少し勉強の必要がありそうです^^; しばらくはライブラリ化をしないで、ソースファイルを追加しながらやっていこうと思います。 時間が出来たら、APIやDirectXを勉強して自作ライブラリに手を出したいと思います。 お手数をおかけしました。いい勉強になりました。 ありがとうございました。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.8 )
名前:管理人 日時:2009/05/27 12:34

Mikanさんの目的が.NetFramework 用のソフトウエアの作成ではなく、 たまたま最初に作成したプロジェクトが C++/CLR を使用した .NetFramework アプリを作成する ものだったのでしたら、プロジェクトを C++ を使用した Win32 アプリケーションを作成する ものに変更することでDXライブラリを使うことができるようになると思います。 面倒だとは思いますが、Mikanさんが作成されたプロジェクトにDXライブラリを追加する という手順ではなく、まずDXライブラリの使い方ページからDXライブラリを使った プログラムがコンパイルできる環境を用意して、その上でDXライブラリを 使用する独自ライブラリを作るようにしてみてください。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.9 )
名前:Mikan 日時:2009/05/27 18:49

>>管理人さん 回答ありがとうございます。 Win32アプリケーションを作成するで作成したファイルをどのようにすれば、ライブラリ(Dll・スタティック)になるのかがわかりませんでした。^^; Dxライブラリを使用してのプログラミングはすでに何本か作成しておりますが、ライブラリ作成がやはり上手くいきませんでした。 ちなみにソースソースファイルとエラーメッセージは下記のとおりです。 // libtest2.h #pragma once #include "DxLib.h" using namespace System; namespace libtest2 { public ref class FpsCtrl { public: //コンストラクタ・デストラクタ FpsCtrl(); ~FpsCtrl(); void setRefreshTime(int); //リフレッシュタイムをセット void wait(); //1周の処理が17ミリ秒(60FPS)になるまで待つ void draw(int,int); //現在のFPSを表示する private: int cnt, refresh_time; //カウンター、リフレッシュタイム保持 int fps_time[2]; //最初&最終カウント保持 double fps; //fps保持 int col_white; //白色の情報 int font_handle; //フォント情報 void calc(); }; } // これは メイン DLL ファイルです。 #include "stdafx.h" #include "libtest2.h" //----------------------------------------------------------------------------- //コンストラクタ //----------------------------------------------------------------------------- FpsCtrl::FpsCtrl(){ //使用する変数の初期化 cnt = 0; fps = 0; refresh_time = 0; fps_time[0] = 0; fps_time[1] = 0; //カラーセット及び、フォントハンドル作成 col_white = GetColor(255,255,255); font_handle = CreateFontToHandle( NULL , 12 , 1 ) ; } //----------------------------------------------------------------------------- //デストラクタ //----------------------------------------------------------------------------- FpsCtrl::~FpsCtrl(){ //フォントハンドル削除 DeleteFontToHandle( font_handle ) ; } //----------------------------------------------------------------------------- //現在のFPSを計測する //----------------------------------------------------------------------------- void FpsCtrl::calc(){ //1周目の時間取得 if( cnt == 0 ) fps_time[0]=GetNowCount(); //50周目の時間取得 if( cnt == 49 ){ fps_time[1] = GetNowCount(); //測定した値からfpsを計算 fps = 1000.0f / ( ( fps_time[1] - fps_time[0] ) / 50.0f ); cnt = 0;//カウントを初期化 }else cnt++; //現在何周目かカウント } //----------------------------------------------------------------------------- //リフレッシュタイムセット //----------------------------------------------------------------------------- void FpsCtrl::setRefreshTime(int _time){ refresh_time = _time; } //----------------------------------------------------------------------------- //1周の処理が17ミリ秒(60FPS)になるまで待つ //※ScreenFlip関数のあとに記入すること //----------------------------------------------------------------------------- void FpsCtrl::wait(){ while( GetNowCount() - refresh_time < 17 ); } //----------------------------------------------------------------------------- //現在のFPSを表示する //----------------------------------------------------------------------------- void FpsCtrl::draw(int _x, int _y){ calc(); if(fps != 0) DrawFormatStringToHandle( _x, _y , col_white, font_handle, "%.1fFPS", fps ) ; } //以下エラーメッセージ 1>------ ビルド開始: プロジェクト: libtest2, 構成: Debug Win32 ------ 1>プロジェクト 'libtest2'、構成 'Debug|Win32' の中間出力ファイルを削除しています。 1>コンパイルしています... 1>Stdafx.cpp 1>コンパイルしています... 1>AssemblyInfo.cpp 1>libtest2.cpp 1>c:\documents and settings\owner\デスクトップ\libtest2\libtest2.h(22) : error C4368: 'fps_time' をマネージ 'libtest2::FpsCtrl' のメンバとして定義できません。混合型はサポートされていません 1>.\libtest2.cpp(10) : error C2653: 'FpsCtrl' : 識別子がクラス名でも名前空間名でもありません。 1>.\libtest2.cpp(10) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>.\libtest2.cpp(12) : error C2065: 'cnt' : 定義されていない識別子です。 1>.\libtest2.cpp(13) : error C2065: 'fps' : 定義されていない識別子です。 1>.\libtest2.cpp(14) : error C2065: 'refresh_time' : 定義されていない識別子です。 1>.\libtest2.cpp(15) : error C2065: 'fps_time' : 定義されていない識別子です。 1>.\libtest2.cpp(16) : error C2065: 'fps_time' : 定義されていない識別子です。 1>.\libtest2.cpp(19) : error C2065: 'col_white' : 定義されていない識別子です。 1>.\libtest2.cpp(20) : error C2065: 'font_handle' : 定義されていない識別子です。 1>.\libtest2.cpp(21) : warning C4508: 'FpsCtrl' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 1>.\libtest2.cpp(26) : error C2653: 'FpsCtrl' : 識別子がクラス名でも名前空間名でもありません。 1>.\libtest2.cpp(26) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。 1>コードを生成中... 1>ビルドログは "file://c:\Documents and Settings\Owner\デスクトップ\libtest2\Debug\BuildLog.htm" に保存されました。 1>libtest2 - エラー 12、警告 1 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== プロジェクトはテンプレートからクラス ライブラリを選択しています。 やはりこれがまずいのでしょうか? よろしくおねがいします。
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.10 )
名前:管理人 日時:2009/05/28 00:05

プロジェクトの作成で最初に目に付く「クラスライブラリ」は .NetFramework上で動作するソフトウエア用のライブラリのことですので、 一般的なWindowsアプリケーション用のライブラリを作成する場合は 「新しいプロジェクト」ウインドウの「プロジェクトの種類」で「Win32」を選択して、 「テンプレート」を「Win32プロジェクト」にした状態で OK を押します さらにそのままだと通常の Win32アプリケーション(実行可能ファイル)を作成する プロジェクトになってしまいますので、次の「Win32 アプリケーションウィザード」で 左側にある「アプリケーションの設定」をクリックして、右側に表示される「アプリケーションの種類」から DLLを作成したい場合は「DLL」を、スタティックリンクライブラリ(拡張子がlibのファイル)を 作成したい場合は「スタティック ライブラリ」を選択して「完了」を押します これでコンパイルして作成されるファイルが exeファイルではなく、Dll or lib ファイルになります
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.11 )
名前:Mikan 日時:2009/05/28 22:52

できましたー♪ 憂煉さん・Willさん・管理人さんありがとうございました。 プロジェクトのクラスライブラリを色々勘違いしていたようです^^; 色々教えてくださりありがとうございました^^
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.12 )
名前:かすがい 日時:2009/07/29 20:57

Dxライブラリを利用した独自ライブラリって、ソー スをビルドしない限りlibファイルをひとつにまとめ られないものなのでしょうか? あのlibファイルの多さがちょっと不便で、ひとつに まとめたライブラリを作ろうかと思ったのですが
Re: Dxライブラリを使用して独自ライブラリを作成したいのですが ( No.13 )
名前:管理人 日時:2009/07/30 00:51

> Dxライブラリを利用した独自ライブラリって、ソー > スをビルドしない限りlibファイルをひとつにまとめ > られないものなのでしょうか? はい、その通りです libファイル同士をくっ付けて一つの lib ファイルにするといったことは 私の知っている限りではできなかったと思います

Page: 1 |