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

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

Page: 1 |

Re: C言語用のDxLib.dllを作成したい ( No.1 )
名前:管理人 日時:2020/09/10 03:00

『関数を返すだけの関数』を介さないようにするにはかなりの大作業になりそうです DXライブラリの関数は C言語仕様ではないので、まず DxLib.h の関数の中から出力したい 関数について extern "C" { } で囲い、実際のコードが書かれている各ソースファイル ( DxGraphics.cpp や DxFile.cpp など )の関数のコードについても extern "C" { } で囲う必要があります ただ、C言語仕様ではコンパイルできない関数については、C言語仕様でコンパイルできるように 書き換える必要があります( C++ の機能は殆ど使用していないので大抵の関数は extern "C" { } で 囲むだけでそのままコンパイルが成功すると思いますが… ) あと、C言語はデフォルトでは呼び出し規約が cdecl なので、一般的な DLL の呼び出し規約の stdcall にするために、全ての関数に __stdcall という記述を追加する必要があります ( この辺りはC#版DXライブラリの中の Source フォルダの中にある DxDLL.h と DxDLL.cpp の 全ての関数に __stdcall が書かれていますので、参考にしてください ) DLLプロジェクトについては通常のDLLプロジェクトにDXライブラリのソースファイルを追加するだけでOKです ただ、UseCLib という文字列が含まれているソースファイル( DxUseCLib.cpp など )やヘッダファイルを追加すると、 コンパイルに zlib や libjpeg などの外部ライブラリが必要になりますので、UseCLib という文字列が 含まれているソースファイルやヘッダファイルはプロジェクトに追加しないようにしてください
メンテ
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ファイルは無いので )
メンテ

Page: 1 |

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

   クッキー保存