2016-06-21 215 views
2

我有一個應用程序需要使用glib和由第三方提供的32位庫。64位Ubuntu上的32位編譯失敗16.04

當我在32位Ubuntu上編譯時,應用程序會生成並運行成功。 然而,當我嘗試在64位的Ubuntu同樣也無法建立,因爲有下列錯誤:

/usr/include/glib-2.0/glib/gtypes.h: In function ‘_GLIB_CHECKED_ADD_U64’: 
/usr/include/glib-2.0/glib/gmacros.h:217:53: error: size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative 
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED 
               ^
/usr/include/glib-2.0/glib/gmacros.h:214:47: note: in definition of macro ‘G_PASTE_ARGS’ 
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2 
             ^
/usr/include/glib-2.0/glib/gmacros.h:217:44: note: in expansion of macro ‘G_PASTE’ 
#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED 
             ^
/usr/include/glib-2.0/glib/gtypes.h:422:3: note: in expansion of macro ‘G_STATIC_ASSERT’ 
G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64)); 
^ 

注:我的gcc-multilib的和g ++ - multilib的。 我也嘗試將/usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h中的定義從8改爲4,但沒有成功。 我也嘗試安裝libglib2.0-dev:i686,但cmake中的pkg config找不到glib。我也爲C,CXX和LD使用了相應的-m32標誌

對此問題的任何幫助將不勝感激。

+0

這與任何圖書館無關。編譯在鏈接階段之前失敗。看看你引用的最後一條錯誤消息,它確切地告訴了什麼是錯的。瞭解guint64是如何定義的以及它的大小。 –

+0

哦,如果您已經更改了安裝標題中的任何內容,請恢復您的更改或重新安裝。 –

+1

感謝guint64被typedefed爲'''unsigned long''',所以我將它改爲'''unsigned long long''。 – Crunchy234

回答

0

不知道爲什麼glib不會嘗試使用int64_t而不是重複那個。對我來說似乎很愚蠢。也許他們這樣做的目的是爲了增加破壞機會,如果你做了你所做的事情,並嘗試使用64位glib安裝來編譯32位代碼。

要編譯32位應用程序,您需要32位庫目標文件(.so)。他們將帶有一個glibconfig.h,它有-m32的適當typedef。

安裝libglib2.0-dev:i686應該是正確的方法。我假設你最終得到了整理,所以你正在構建的應用程序找到-I包含路徑和-L庫路徑。