32位编译在64位Ubuntu 16.04上失败。

3

我有一个需要使用glib和第三方提供的32位库的应用程序。

当我在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。我还使用了适当的-m32标志用于C、CXX和LD。
如有帮助将不胜感激。

这与任何库都无关。编译失败发生在链接阶段之前。看一下你引用的最后一个错误消息,它准确地说明了问题所在。找出 guint64 是如何定义的以及它的大小是多少。 - n. m.
如果您在已安装的头文件中更改了任何内容,请撤消更改或重新安装。 - n. m.
1
感谢您,guint64已被typedef为unsigned long,因此我将其更改为unsigned long long - Crunchy234
1
现在我的问题是链接器找不到任何GLib库。 /usr/bin/ld: 无法找到 -lglib-2.0 /usr/bin/ld: 无法找到 -lgio-2.0 /usr/bin/ld: 无法找到 -lgobject-2.0 /usr/bin/ld: 无法找到 -lglib-2.0 /usr/bin/ld: 无法找到 -lgio-2.0 /usr/bin/ld: 无法找到 -lgobject-2.0 - Crunchy234
如果您以任何方式更改已安装的软件包,则自行承担风险。我建议从头重新安装操作系统。 - n. m.
不知道为什么glib不会尝试使用int64_t而是要复制它。对我来说似乎很愚蠢。 - Peter Cordes
1个回答

1
我不知道为什么GLib不使用int64_t而是复制它。对我来说这似乎很愚蠢。也许他们故意这样做以增加破坏的机会,如果您尝试使用64位GLib安装编译32位代码。
要编译32位应用程序,您需要32位库对象文件(.so)。它们将带有适用于-m32glibconfig.h中的typedefs。
安装libglib2.0-dev:i686应该是正确的方法。我假设您最终解决了这个问题,所以您正在构建的应用程序可以找到其-I包含路径和-L库路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接