2016-06-21 211 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库路径。