我在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的无符号__int64和uint64_t中一个typedef否则。在C(不是C ++构建当),并且如果布尔没有另外定义,它是无符号字符一个typedef。)
当我致电sp_offline_sync_get_status
时,只有queued_tracks
似乎有正确的数据,其余的都是垃圾。但是,如果我编辑头文件以包含#pragma pack(1)
,它似乎会给出更合理的结果。即使我尝试构建libspotify附带的spshell
示例,我也会观察到这种行为。*
这让我相信libspotify二进制文件是使用默认的一些不同的编译器标志编译的,至少在使用Visual C ++的Windows上。我应该如何编译C或C ++代码才能使用libspotify?或者我应该在#including 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
中的switch语句。此外,它在函数offline_status_updated
中的spshell.c中使用字符串格式说明符“%zd”。 Microsoft C运行时似乎没有处理此问题,因此需要更改它(例如,如果您只希望它在Windows上运行,或者对平台敏感的宏,则需要更改为“%Iu”)。
答案 0 :(得分:3)
libspotify使用'-Zp4'编译,而标准似乎是'-Zp8'。我想可以使用该标志进行编译,或使用#pragma pack(4)指令(我实际上认为4比1更正确,正如您在问题中所使用的那样)
将在Jira中添加注释来修复你指出的spshell.c中的错误。谢谢!