2013-01-10 78 views
2

我在Windows上使用libspotify 12.1.51。虽然大多正常工作,我有一些困难sp_offline_sync_statuslibspotify预期与打包有关的编译器标志是什么?

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”)。

回答

3

libspotify编译为'-Zp4',而标准似乎是'-Zp8'。我想可以用这个标志编译,或者使用#pragma pack(4)指令(我实际上认为4比1更正确,就像你在你的问题中使用的一样)

会在Jira中写一个注释来修复您指出spshell.c中的错误。谢谢!

相关问题