【问题标题】:32 bit compilation failing on 64 bit Ubuntu 16.0432 位编译在 64 位 Ubuntu 16.04 上失败
【发布时间】:2016-06-21 04:27:41
【问题描述】:

我有一个应用程序需要使用 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。我还在为 C、CXX 和 LD 使用适当的 -m32 标志

对于这个问题的任何帮助将不胜感激。

【问题讨论】:

  • 这与任何库无关。在链接阶段之前编译失败。查看您引用的最后一条错误消息,它准确地说明了问题所在。了解 guint64 是如何定义的以及它的大小。
  • 哦,如果您更改了已安装标头中的任何内容,请恢复您的更改或重新安装。
  • 谢谢 guint64 被定义为unsigned long 所以我把它改成了unsigned long long
  • 现在我的问题是链接器找不到任何 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
  • 如果您以任何方式更改已安装的软件包,您只能靠自己。我建议从头开始重新安装操作系统。

标签: c linux ubuntu gcc glib


【解决方案1】:

不知道为什么 glib 不尝试使用 int64_t 而不是复制它。对我来说似乎很愚蠢。也许他们这样做是为了增加破坏的机会,如果你这样做,并尝试使用 64 位 glib 安装来编译 32 位代码。

要编译 32 位应用程序,您需要 32 位库对象文件 (.so)。他们将附带一个glibconfig.h,该-m32 具有适当的类型定义。

安装libglib2.0-dev:i686 应该是正确的方法。我假设您最终解决了这个问题,因此您正在构建的应用程序会找到 -I 包含路径和 -L 库路径。

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2013-10-20
    • 1970-01-01
    • 2023-03-20
    • 2017-01-21
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多