トップページ > 記事閲覧
C言語用のDxLib.dllを作成したい
名前:ぽむ 日時: 2020/09/09 19:49

すでにあるC#用のDLLではなく、C言語用のDxLib.dllを作成したいです。(実際には他の言語で使用します) DLLのプロジェクトでlibの関数をreturnする関数を作ることで実現できるのですが、 関数を返すだけの関数というのは、呼び出しのオーバーヘッドが無駄だと思いまして。 C#用のDLLでダメな理由は、動画や3D関連、メルセンヌツイスタ等の関数が不要なのでコンパクトにしたく、 また、VC++2019の最適化などを利用したいためです。 改造用ソースのDLLプロジェクト版のようなものは、どのように作成すればよいでしょうか。
メンテ

Page: 1 | 2 |

Re: C言語用のDxLib.dllを作成したい ( No.2 )
名前:ぽむ(解決) 日時:2020/09/10 19:02

詳しい説明と注意点、ありがとうございます。 挑戦してみます。(いったん解決とさせていただきます)
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.3 )
名前:デラックス図書館 職員 日時:2022/02/19 10:51

GNU C++用パッケージの.aファイルをdllに変換したらいいような... →やってみた(失敗) rem 静的ライブラリファイルをオブジェクトファイルに戻す(カレントディレクトリにずらずら生成される) ar x libDxLib.a ar x libDxUseCLib.a ar x libDxDrawFunc.a ar x libjpeg.a ar x libpng.a ar x libzlib.a ar x libtiff.a ar x libtheora_static.a ar x libvorbis_static.a ar x libvorbisfile_static.a ar x libogg_static.a ar x libbulletdynamics.a ar x libbulletcollision.a ar x libbulletmath.a ar x libopusfile.a ar x libopus.a ar x libsilk_common.a ar x libcelt.a rem 1つの静的ライブラリにまとめる(libDx.aが生成される) ar r libDx.a *.o rem dllにする(ここでエラー) g++ -shared -Wl,--out-implib,libDx__.a,--base-file,libDx__.exp,-Map,libDx__.map,--export-all-symbols,--enable-auto-import,--whole-archive libDx.a -Wl,--no-whole-archive -o DxLib.dll エラー↓ libDx.a(apiwrapper.o):apiwrapper.c:(.text+0x2a1): undefined reference to `th_comment_init' libDx.a(apiwrapper.o):apiwrapper.c:(.text+0x2b1): undefined reference to `th_comment_query' libDx.a(apiwrapper.o):apiwrapper.c:(.text+0x2c1): undefined reference to `th_comment_query_count' libDx.a(apiwrapper.o):apiwrapper.c:(.text+0x2d1): undefined reference to `th_comment_clear' libDx.a(apiwrapper.o):apiwrapper.c:(.text+0x2e1): undefined reference to `th_comment_add' libDx.a(apiwrapper.o):apiwrapper.c:(.text+0x2f1): undefined reference to `th_comment_add_tag' libDx.a(celt_decoder.o):celt_decoder.c:(.text+0x353): undefined reference to `clt_mdct_backward_c(mdct_lookup const*, float*, float*, float const*, int, int, int, int)' libDx.a(celt_decoder.o):celt_decoder.c:(.text+0x46d): undefined reference to `clt_mdct_backward_c(mdct_lookup const*, float*, float*, float const*, int, int, int, int)' libDx.a(celt_decoder.o):celt_decoder.c:(.text+0x588): undefined reference to `clt_mdct_backward_c(mdct_lookup const*, float*, float*, float const*, int, int, int, int)' libDx.a(celt_decoder.o):celt_decoder.c:(.text+0x5f9): undefined reference to `clt_mdct_backward_c(mdct_lookup const*, float*, float*, float const*, int, int, int, int)' libDx.a(celt_encoder.o):celt_encoder.c:(.text+0x2746): undefined reference to `clt_mdct_forward_c(mdct_lookup const*, float*, float*, float const*, int, int, int, int)' libDx.a(decinfo.o):decinfo.c:(.text+0x5f6): undefined reference to `th_comment_clear' libDx.a(decinfo.o):decinfo.c:(.text+0x638): undefined reference to `th_info_clear' libDx.a(enc_API.o):enc_API.c:(.text+0x558): undefined reference to `silk_encode_do_VAD_FLP' libDx.a(enc_API.o):enc_API.c:(.text+0x602): undefined reference to `silk_encode_frame_FLP' libDx.a(enc_API.o):enc_API.c:(.text+0xc3c): undefined reference to `silk_encode_frame_FLP' libDx.a(enc_API.o):enc_API.c:(.text+0xf2a): undefined reference to `silk_encode_do_VAD_FLP' libDx.a(http.o):http.c:(.text+0x54): undefined reference to `op_strncasecmp(char const*, char const*, int)' libDx.a(opus_encoder.o):opus_encoder.c:(.text+0x366f): undefined reference to `run_analysis(TonalityAnalysisState*, OpusCustomMode const*, void const*, int, int, int, int, int, int, int, void (*)(void const*, float*, int, int, int, int, int), AnalysisInfo*, int)' libDx.a(opus_multistream_encoder.o):opus_multistream_encoder.c:(.text+0xf0b): undefined reference to `clt_mdct_forward_c(mdct_lookup const*, float*, float*, float const*, int, int, int, int)' libDx.a(opusfile.o):opusfile.c:(.text+0x4ca): undefined reference to `opus_head_parse' libDx.a(opusfile.o):opusfile.c:(.text+0x6f1): undefined reference to `opus_tags_parse' libDx.a(opusfile.o):opusfile.c:(.text+0x727): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x820): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x838): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x9e0): undefined reference to `opus_tags_get_album_gain' libDx.a(opusfile.o):opusfile.c:(.text+0xa05): undefined reference to `opus_tags_get_track_gain' libDx.a(opusfile.o):opusfile.c:(.text+0x1e98): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x3304): undefined reference to `opus_head_parse' libDx.a(opusfile.o):opusfile.c:(.text+0x373c): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x3acc): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x3e3c): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x41ac): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x44cc): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x47cc): more undefined references to `opus_tags_clear' follow libDx.a(opusfile.o):opusfile.c:(.text+0x4990): undefined reference to `opus_tags_get_album_gain' libDx.a(opusfile.o):opusfile.c:(.text+0x4a2a): undefined reference to `opus_tags_get_track_gain' libDx.a(opusfile.o):opusfile.c:(.text+0x4af0): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x4b55): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x5438): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x5de2): undefined reference to `opus_tags_clear' libDx.a(opusfile.o):opusfile.c:(.text+0x7066): undefined reference to `opus_tags_get_track_gain' libDx.a(opusfile.o):opusfile.c:(.text+0x7088): undefined reference to `opus_tags_get_album_gain' collect2.exe: error: ld returned 1 exit status 環境 : MinGW-w64 x86_64-posix-seh-rev0 といった感じであと1歩というところまで迫りました
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.4 )
名前:管理人 日時:2022/02/22 00:18

こちらのスレッドの頃はまだだったのですが、去年の3月に、コンパイル時のプリプロセッサ定義に DX_COMPILE_TYPE_C_LANGUAGE を追加してコンパイルするとDXライブラリの関数を C言語のソース( 拡張子 c のファイル )から 呼べるようになりました( DXライブラリ内部の処理は C++ だけど、DXライブラリの関数呼び出し部分だけは C言語仕様になる ( extern "C" { } を使用 ) ) なので DX_COMPILE_TYPE_C_LANGUAGE を使用すれば 『C言語用のDxLib.dllを作成する』 のも容易なのではないかと思います (・・
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.5 )
名前:ぽむ 日時:2022/02/25 22:50

スレッドを立てたものですが、浮上していたので あれからdllを使用する本体のプログラムの開発がダラダラ続いていて、その間dxlibも更新されていっていますので 途中から暫定でC#用のdllを使わせてもらっていました ただ、当初のdllは「3Dモデル機能&ソフトウエアレンダリング機能無しパッケージ」をベースにしていて それと比べるとC#用のdllは初回起動の時間が明らかに長く、そこが気になっていました 「DX_COMPILE_TYPE_C_LANGUAGE」で簡単に構築できるようなら大変助かりますので試してみようと思います
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.6 )
名前:デラックス図書館 職員 日時:2022/02/27 13:40

私とまったく同じ環境でこのようなページを見つけました。 teratail.com/questions/k41inidr5azpfq#reply-2d0k7ok18ownkh
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.7 )
名前:デラックス図書館 職員 日時:2022/02/27 13:55

書き忘れていましたが, 「C言語用のDLL」というのは「ネイティブコードのDLL」ということですよね? DLL自体は言語が違っても呼び出せるものなので上記の方法でできると思います。 管理人はMinGWに疎いそうですが, DLL版も配布していただけませんかね...
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.8 )
名前:管理人 日時:2022/02/27 21:02

> デラックス図書館 職員さん > 管理人はMinGWに疎いそうですが, DLL版も配布していただけませんかね... すみません、MinGW はバージョンごとの互換性が無く、今でも対応バージョン全部別々にビルドしていて一番時間が掛かっているので 更に DLL まで追加というのはちょっと勘弁してください、という感じです ( ̄▽ ̄;
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.9 )
名前:デラックス図書館 職員 日時:2022/03/05 15:03

DXライブラリの置き場をよく見ていませんでした。 DXライブラリって, Borland C++ Compiler でコンパイルしなければいけないんですね。 MinGWでなく, bccでDLLの出力をすればいいのでは?
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.10 )
名前:管理人 日時:2022/03/06 03:12

> DXライブラリって, Borland C++ Compiler でコンパイルしなければいけないんですね。 DXライブラリは Borland C++ Compiler でも Visual Studio でも MinGW でも Android Studio でも Xcode でもコンパイルできるようになっています ( Windows環境では Borland C++ Compiler か Visual Studio か MinGW ) > MinGWでなく, bccでDLLの出力をすればいいのでは? ぽむさんが何のコンパイラを使用されているかは不明ですが、 C#用の DLL は Visual Studio を使用して出力しています
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.11 )
名前:デラックス図書館 職員 日時:2022/03/08 20:56

「DXライブラリ自体のコンパイル」という意味です。 ライブラリ自体をコンパイルするときにDLLにすればいいと思います
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.12 )
名前:管理人 日時:2022/03/10 23:30

はい、C言語のDLLを作成するときはDXライブラリのlibファイルを使用するのではなく、 DXライブラリのソースファイルをコンパイルすることになると思います( C言語用のlibファイルは無いので )
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.13 )
名前:777shuang 日時:2022/08/23 11:08

DXライブラリのDllを作ってみました。MinGWでの使用を想定していますので、もしかしたらMSVCなどでは使えないかもしれません。 sites.google.com/view/777shuang/%E4%B8%8D%E5%AE%9A%E6%9C%9F%E6%9B%B4%E6%96%B0%E6%97%A5%E8%A8%98/2022%E5%B9%B4/8%E6%9C%88/dxlib-dll
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.14 )
名前:管理人 日時:2022/08/24 00:47

DXライブラリの Dll はC#用パッケージの中にあったりしますが、777shuangさんが作成されたのは MinGW用のものなのですね 手元で MinGW のテストソースで試してみたところ問題なくビルドでき、実行することが出来ました 沢山のaファイルが必要ないのは良いですね (^ ^ ( 尚、残念ながら MSVC ではリンクエラーが発生して使用することは出来ませんでした )
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.15 )
名前:777shuang 日時:2022/08/24 19:22

>>14 MSVC向けに作るというか、TCHARの型によってDLLを変えないといけないんですよね MinGW向けの静的ライブラリにも末尾にWがついているファイルがありますが、それで作ったDxLib.DLLならMSVCでも動くかと 後でやっておきます
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.16 )
名前:管理人 日時:2022/08/26 00:28

アップしていただいた DxLibA.dll と DxLibW.dll を使用させていただきましたが、 やはりMSVCではリンクエラーが発生して使用することはできませんでした MinGWの g++.exe ではoファイルやaファイルと同じようにdllファイルを指定すると 自動的にdllの中の関数を使用する exeファイルを作成してくれますが、 MSVCの cl.exe にはそのような機能はないようで 引数に渡せるファイルは objファイルか libファイルのみのようです (- -;
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.17 )
名前:777shuang 日時:2022/09/20 17:34

>>4に倣ってソースコードからコンパイルを試みたんですが、Ogg関連のところで、PlaySoundMemのデフォルト引数に頼っているようなので、直していただけるとありがたいです C言語ではデフォルト引数はできなかったはずなので...
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.18 )
名前:777shuang 日時:2022/09/20 17:37

(アップデートに対応しようとすると当方で毎回書き換えるのは非効率的なので)
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.19 )
名前:管理人 日時:2022/09/20 23:02

コンパイルオプションに -DDX_COMPILE_TYPE_C_LANGUAGE を追加して #define DX_COMPILE_TYPE_C_LANGUAGE が定義されているのと同じ状態にしていただくとデフォルト引数や同名関数など C言語では許容されていない記述を無効化することができますので、よろしければお試しください
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.20 )
名前:777shuang 日時:2022/09/21 08:16

>>19、いえ、DXライブラリ自体のビルドの話です
メンテ
Re: C言語用のDxLib.dllを作成したい ( No.21 )
名前:管理人 日時:2022/09/23 05:18

> いえ、DXライブラリ自体のビルドの話です はい、DXライブラリ自体のビルドの際に -DDX_COMPILE_TYPE_C_LANGUAGE を追加していただければ デフォルト引数や同名関数など C言語では許容されていない記述を無効化することができます
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存