2013-01-10 54 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中的錯誤。謝謝!

相關問題