我在Windows上使用libspotify 12.1.51。虽然大多正常工作,我有一些困难sp_offline_sync_status
:libspotify预期与打包有关的编译器标志是什么?
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二进制与来自默认,至少在Windows上使用Visual C一些不同的编译器标志++编译。我应该如何编译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”)。