トップページ > 記事閲覧
Android版のSetCurrentPositionSoundMemの件
名前:ギウ 日時: 2023/08/30 20:46

お世話になっております。 以前も書き込んで解決していなかったビルドエラーですが、 最新版だと ===== ld: error: undefined symbol: DxLib::SetCurrentPositionSoundMem(long long, int) >>> did you mean: DxLib::SetCurrentPositionSoundMem(long, int) >>> defined in: C:/DxLib_Android/�v���W�F�N�g�ɒlj����ׂ��t�@�C��_Android�p/arm64-v8a/libDxLib.a(DxSound.cpp.o) ===== というエラーになっていたので、試しに namespace DxLib { extern int SetCurrentPositionSoundMem(long, int); } を宣言してビルドしたら通りました! スマホ上でも正しく動作しています。 なのでもしかしたら、Lib内が (long, int) で作られていて、ヘッダ側が(long long, int)で定義されてるせいかなと思ったのですが、如何でしょう。
メンテ

Page: 1 |

Re: Android版のSetCurrentPositionSoundMemの件 ( No.1 )
名前:管理人 日時:2023/08/31 02:20

ご情報ありがとうございます! 一箇所 SetCurrentPositionSoundMem の第一引数の型を int と書いてしまっていた箇所があったのですが、 そこは通常のコンパイルでは #ifdef の切り替えでコンパイルされないはずの箇所で、それ以外の部分は LONGLONG となっていました とはいえもしかしたら件の箇所がコンパイルされてしまっているのかもと思い int を LONGLONG に変更して コンパイルしようとしたのですが、Android Studio をアップグレードした関係でビルドが通らなくなって しまったので少し確認に時間が掛かりそうです すみませんが明日以降に改めて確認しますので数日ほどお時間をください m(_ _;m
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.2 )
名前:ギウ 日時:2023/08/31 08:36

了解です!(Android Studioのアップグレードはほんと厄介;) 自分で宣言することで問題なく動いてますので、ゆっくりで大丈夫です。
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.3 )
名前:ギウ 日時:2023/08/31 22:09

すみません、続報です。 Runでビルド&スマホへ流すと問題ないのですが、 APKやaabファイルを作ろうとすると、ビルドエラーになりました。 longをやめて、int や long long、定義なしでも同じ; SetCurrentPositionSoundMemをコメントアウトすれば、apkを作れます。
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.4 )
名前:管理人 日時:2023/09/02 00:37

原因が何かは謎ですが、とりあえず手元で件の第一引数が int になっている箇所を LONGLONG に書き換えてみました 手元で試した限りでは SetCurrentPositionSoundMem を使用してもリンクエラーは 発生しませんでしたので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.5 )
名前:ギウ 日時:2023/09/02 16:42

ありがとうございます。 最新版試してみましたが、変化なしでした。。 (リンク先の確認や、リビルドも試しました) 何故この関数だけ使えないのか謎ですね;
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.6 )
名前:管理人 日時:2023/09/02 20:49

うーん駄目でしたか… LONGLONG の #define 定義がどこかで long と定義されていて、そちらが優先されて しまっている可能性を考えて SetCurrentPositionSoundMem の実装部分を #ifdef __ANDROID__ extern int SetCurrentPositionSoundMem( long long SamplePosition, int SoundHandle ) #else // __ANDROID__ extern int SetCurrentPositionSoundMem( LONGLONG SamplePosition, int SoundHandle ) #endif // __ANDROID__ { ↑ こちらのように Android でビルドする際は LONGLONG ではなく直接 long long と記述するようにしてみました これでも駄目でしたら謎ですが、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.7 )
名前:ギウ 日時:2023/09/03 08:00

最新版試しました! DxLib_Init() ProcessMessage() DxLib_End() でリンクエラーになりました。 clang++: error: linker command failed with exit code 1 (use -v to see invocation) あと、DxLib.h の方、LONGLONG のままの記述でしたけどこれは大丈夫でしょうか。 >LONGLONG の #define 定義がどこかで long と定義されていて、そちらが優先されて APKやaabは64bitと32bitを両方ビルドしてるみたいなので、それによって変わってしまうとか(?)
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.8 )
名前:管理人 日時:2023/09/04 00:44

すみません、Android版では不要だと思っていた DxGateway.cpp を コンパイル対象から外したのがリンクエラーの原因です… 再度アップしましたので、何度も申し訳ありませんが よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版 > あと、DxLib.h の方、LONGLONG のままの記述でしたけどこれは大丈夫でしょうか。 はい ld: error: undefined symbol: DxLib::SetCurrentPositionSoundMem(long long, int) >>> did you mean: DxLib::SetCurrentPositionSoundMem(long, int) ↑ こちらは『ヘッダファイルでは long long だけど、実際に存在した関数では long だったよ』 というエラーなので、ヘッダファイル( DxLib.h )の方は問題なく LONGLONG として処理されていると思いますので… > APKやaabは64bitと32bitを両方ビルドしてるみたいなので、それによって変わってしまうとか(?) LONGLONG は Android版では #ifndef LONGLONG #define LONGLONG int64_t #endif ↑ このように 64bit固定として定義しているので、それは無いと思いますが… ( 32bit環境では64bit整数型は long long、 64環境では64bit整数型は long、だったりしたら有り得そうですが… )
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.9 )
名前:ギウ(解決) 日時:2023/09/04 09:35

ご対応ありがとうございます! APKとaabファイルも作れました! ただ宣言はしないといけなくて、 #define DX_LONG long long namespace DxLib { extern int SetCurrentPositionSoundMem(DX_LONG, int); } void hoge() { DxLib::SetCurrentPositionSoundMem((DX_LONG)pos, id); } こんな感じで通りました。 謎は残りますが(こちらの問題ということも;)、 ひとまず解決としてさせて頂きます! (こちらでビルドテストが必要な場合はお付き合いします)
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.10 )
名前:管理人(解決) 日時:2023/09/05 02:07

APK と aabファイルが作成できたとのことで何よりです とはいえ、追加で定義が必要だったのですね… > (こちらでビルドテストが必要な場合はお付き合いします) すみません、お言葉に甘えて… 追加の定義が無くてもビルドが成功するように できたと思われるバージョンをアップしましたので、 よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版 LONGLONG は DxDataTypeAndroid.h の中で #ifndef LONGLONG #define LONGLONG int64_t #endif と定義していたのですが、int64_t は stdint.h の中で typedef __int64_t int64_t; と定義されていて、更に __int64_t は #if defined(__LP64__) typedef long __int64_t; #else typedef long long __int64_t; #endif と定義されていました __LP64__ は 64bit環境では自動的に定義されていることになる識別子なので つまり 64bit環境では int64_t は long に、32bit環境では int64_t は long long に 置き換えられていたということになります なので、最初のギウさんのご投稿にある ld: error: undefined symbol: DxLib::SetCurrentPositionSoundMem(long long, int) >>> did you mean: DxLib::SetCurrentPositionSoundMem(long, int) ↑ こちらのエラーが、もし 64bit環境のコンパイル時に発生したものだとしますと 実際にある関数が long なのは正しく、使用しようとしている方が long long なのが 間違っていることになります なので、もしかしたらギウさんのコードの中で #include "DxLib.h" の前の行などに 別のヘッダファイルのインクルード文があり、そのヘッダファイルの中で #define int64_t long long などの記述があって、64bit環境でも 32bit環境でも long long として処理されてしまい、 libDxLib.a の中にある関数と定義が異なってしまい件のエラーが発生していたのかもしれません
メンテ
Re: Android版のSetCurrentPositionSoundMemの件 ( No.11 )
名前:ギウ(解決) 日時:2023/09/06 08:36

最新版ありがとうございます! 宣言無しで通りました! ご説明もありがとうございます! >なので、もしかしたらギウさんのコードの中で #include "DxLib.h" の前の行などに すみません! 最初の投稿時はこちらの宣言が前に来ていました。 たぶんエラーメッセージが変わってたはずなので報告したほうが良かったですね; (移動させてもビルドが通らなかったので関係ないと思ってしまいました) 今回も迅速なご対応ありがとうございます!
メンテ

Page: 1 |

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

   クッキー保存