libspotify期望哪些编译器标志与打包相关?

libspotify期望哪些编译器标志与打包相关?,spotify,libspotify,Spotify,Libspotify,我正在Windows上使用libspotify 12.1.51。虽然它基本上按预期工作,但我在sp_脱机_同步_状态方面遇到了一些困难: 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;

我正在Windows上使用libspotify 12.1.51。虽然它基本上按预期工作,但我在sp_脱机_同步_状态方面遇到了一些困难:

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和uint64上未签名的int64的typedef。在C(非C++)中构建时,如果未另外定义bool,则它是未签名字符的typedef。)

当我调用
sp\u offline\u sync\u get\u status
时,只有
queued\u曲目
似乎有正确的数据,其余的都是垃圾。但是,如果我编辑头文件以包含
#pragma pack(1)
,它似乎会给出更合理的结果。即使在我尝试构建libspotify附带的
spshell
示例时,我也观察到了这种行为*

这使我相信LISSPOTHIST二进制是用默认的一些编译器标志编译的,至少在Visual C++中是用Windows编译的。我应该如何编译C或C++代码来使用LISPISTURE?或者我应该先使用#pragma pack#包括api.h,然后再恢复它?我能期望这在未来版本的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来修复
控制台输入中的开关语句
。此外,它在函数
offline\u status\u updated
中使用spshell.c中的字符串格式说明符“%zd”。Microsoft C运行时似乎无法处理此问题,因此需要对其进行更改(例如,如果您只希望它在Windows上工作,则将其更改为“%Iu”,或者更改为平台敏感的宏)。

libspotify使用“-Zp4”编译,而标准似乎是“-Zp8”。我想可以使用该标志进行编译,或者使用#pragma pack(4)指令(我实际上认为4比1更正确,正如您在问题中使用的那样)

将在Jira中添加注释,以修复您指出的spshell.c中的错误。谢谢