我在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和uint64_t的类型定义。当使用C(而不是c++)构建时,如果没有另外定义bool,则它是unsigned char的类型定义。
当我调用sp_offline_sync_get_status
时,只有queued_tracks
似乎有正确的数据,其余的都是垃圾。然而,如果我编辑头文件以包括#pragma pack(1)
,它似乎给出了更合理的结果。我甚至在尝试构建libspotify附带的spshell
示例时也观察到这种行为。*
这让我相信libspotify二进制文件是用一些不同于默认的编译器标志编译的,至少在Windows和Visual c++上是这样。我应该如何编译C或c++代码来使用libspotify?或者我应该在# include api.h之前使用#pragma pack,然后将其还原回来?我能期望这在libspotify的未来版本中保持稳定吗?或者它可能会改变吗?它在不同平台上有何不同?
我真正的目标是编写c# p/Invoke代码,使用Mono可以在各种平台上工作。在非windows平台上,libspotify是否坚持本机编译器的默认对齐方式,或者我需要在每个平台上指定自定义对齐方式?
[*] -我必须先修复一些其他的bug。如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",或者更改为平台敏感的宏)。
libspotify是用'-Zp4'编译的,而标准似乎是'-Zp8'。我想一个人可以用那个标志编译,或者使用#pragma pack(4)指令(我实际上认为4比1更正确,正如你在问题中使用的)
将在Jira中添加注释,以修复您在spshell.c中指出的错误。谢谢!