我在 Windows 上使用 libspotify 12.1.51。虽然它主要按预期工作,但我遇到了一些困难sp_offline_sync_status
:
typedef struct sp_offline_sync_status {
int queued_tracks;
sp_uint64 queued_bytes;
int done_tracks;
sp_uint64 done_bytes;
int copied_tracks;
sp_uint64 copied_bytes;
int willnotcopy_tracks;
int error_tracks;
bool syncing;
} sp_offline_sync_status;
(sp_uint64
在 Windows 上是 unsigned __int64 的 typedef,否则是 uint64_t。在 C(不是 C++)中构建时,如果 bool 没有另外定义,它是 unsigned char 的 typedef。)
当我打电话时sp_offline_sync_get_status
,queued_tracks
似乎只有正确的数据,其余的都是垃圾。但是,如果我将头文件编辑为包含#pragma pack(1)
,它似乎会给出更合理的结果。即使我尝试构建spshell
libspotify 附带的示例,我也会观察到这种行为。*
这使我相信 libspotify 二进制文件是使用一些与默认值不同的编译器标志编译的,至少在使用 Visual C++ 的 Windows 上是这样。我应该如何编译 C 或 C++ 代码以使用 libspotify?或者我应该在#include api.h 之前使用#pragma pack 然后恢复它?我可以期望这在未来版本的 libspotify 中保持稳定还是可能会改变?它在不同平台上有何不同?
我的真正目标是编写 C# P/Invoke 代码,该代码可在各种使用 Mono 的平台上运行。在非 Windows 平台上,libspotify 是否坚持本机编译器的默认对齐方式,还是我需要在每个平台上指定自定义对齐方式?
[*] - 不过,我确实必须先修复一些其他错误。正如 libspotify 12.1.51 中所提供的,在 Windows 上,spshell 将控制按键(例如 shift、ctrl)注册为输入 NUL 字符。这可以防止在控制台中键入或粘贴 spotify URI。这可以通过编辑 spshell_win32.c 添加case 0: break;
到console_input
. 此外,它在函数的 spshell.c 中使用字符串格式说明符“%zd” offline_status_updated
。Microsoft C 运行时似乎无法处理此问题,因此需要对其进行更改(例如,如果您只希望它在 Windows 上工作,则更改为“%Iu”,或者更改为平台敏感的宏)。