编译 64 位 Linux 的 32 位 GTK+ 应用程序

标签 c linux linker 32bit-64bit gtk

我在 64 位 Linux(尤其是 Ubuntu 10.04)上编译 32 位 GTK+ 应用程序时遇到一些问题。编译 64 位 GTK+ 应用程序工作正常,所有设置也可以编译 32 位应用程序,但它不适用于 GTK+

我有一个非常简单的测试程序,我正在使用它来解决问题,它只是一个 gtk_init 和一个 gtk_main,可以很好地编译为 -m64。我正在用 gcc 4.6.2 编译,调用它:

gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

这是我收到的两种不同类型的错误消息:

/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../x86_64-unknown-linux-gnu/bin/ld: warning: libXext.so.6, needed by /usr/lib/../lib32/libgtk-x11-2.0.so, not found (try using -rpath or -rpath-link)

/usr/lib/../lib32/libgdk-x11-2.0.so: undefined reference to `XmbSetWMProperties'

请记住,这些不是唯一的错误,我只是包括了两种特定类型以供引用,为了简短起见,我得到了整个 GTK+ 库堆栈的错误。

我的 lib32 文件夹中确实有所有正确的 32 位版本的库。

希望有人以前遇到过这个问题并且可以帮助我,这真的让我很头疼,而且我在网上的任何地方都无法提供太多帮助。

请询问您是否需要我提供任何其他信息来帮助诊断此问题。

注意:我有 ia32-libs 和 gcc-multilib 包。 Ubuntu 10.04 没有单独的 ia32-libs-gtk 包,但我认为这些包在 ia32-libs 包中。它们都存在于我的系统中。

我认为这一定是某种链接器配置问题。我最近构建了新的 Free Pascal 编译器和一个 32 位交叉编译器,我还将 GCC 升级到 4.6.2 以利用一些新的 C++ 功能和对 C99 支持的修复。默认的 4.4.3 GCC 仍然存在于我的系统上。我认为问题是在我安装新的 binutils 时引入的,因为我一直在尝试将 Clang 和 LLVM 作为工具链,并且我希望 ld 具有插件功能,所以我想不妨将它们全部升级。

编译 64 位程序一切正常,新工具根本没有任何问题,我可以编译 32 位程序,但是当需要显式链接某些内容时,我遇到了问题。

我知道我当前的库集是合适的,并且我安装了仅发出 32 位代码的 Free Basic,并且在这次升级之前我能够毫无问题地构建 32 位 GTK+ 程序。

只是想知道是否有人知道这次升级中可能更改了哪些配置,或者他们以前发生过这种情况?我真的应该升级到更新的发行版,这样我就可以利用所有新软件而不必破解我的所有软件包,但不幸的是,更新内核中有一个错误阻止我的计算机从待机状态恢复,并且这是我用于个人项目的笔记本电脑,因此适当的电源管理非常重要,如果我把系统搞砸也不会造成太大损失,除了我已经为我的工作流程设置了非常完美的系统。

最佳答案

您可以告诉 pkg-config 使用环境变量 PKG_CONFIG_PATH 搜索 32 位库。 对于 Ubuntu:

export PKG_CONFIG_PATH=/usr/lib32/pkgconfig:$PKG_CONFIG_PATH

对于红帽:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH

关于编译 64 位 Linux 的 32 位 GTK+ 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8258778/

相关文章:

python - 在不连接到服务器的情况下执行python脚本

c - 为什么我不能使用动态分配的字符串创建临时文件?

c - 为什么这段代码会有输出?

c - BYTE 数组到 HEX 字符串转换的最佳方法? (避免出现有趣的角色)

python - 检测 GUI 中的特定按键

c - -Wl,-wrap=symbol 不适用于共享库

c++ - CMake 没有按预期链接库(如何强制链接)

c - 如何监控linux自旋锁等待时间?

c - 如何在 C 中使用枚举

linker - Admob 链接器错误