编译 32 位 GTK+ 64位Linux的应用
我在 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 位程序,但是当需要显式链接某些内容时我遇到了问题。
我知道我当前的库集是合适的,并且我安装了 Free Basic,它仅发出 32 位代码,并且在升级之前我能够构建 32 位 GTK+ 程序,没有问题。
只是想知道是否有人知道此升级中可能更改了哪些配置或者以前发生过这种情况?我真的应该升级到更新的发行版,这样我就可以利用所有新软件,而不必破解我的所有软件包,但不幸的是,新内核中存在一个错误,导致我的计算机无法从待机状态恢复,并且这是我用于个人项目的笔记本电脑,因此适当的电源管理非常重要,如果我破坏系统,除了我将其设置为非常适合我的工作流程之外,这并不是一个巨大的损失。
I am having some trouble compiling 32-bit GTK+ applications on 64-bit Linux, specifically Ubuntu 10.04. Compiling 64-bit GTK+ applications works fine, and everything is set up to compile 32-bit apps as well, but it doesn't work with GTK+
I have a very simple test program that I am using for trouble shooting that is simply a gtk_init and a gtk_main, which compiles fine as -m64. I am compiling with gcc 4.6.2, calling it with:
gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
These are the two different kinds of error messages I get:
/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)
and
/usr/lib/../lib32/libgdk-x11-2.0.so: undefined reference to `XmbSetWMProperties'
Keep in mind that these aren't the only errors, I just included the two specific types for reference and to keep it short, I get errors for the whole stack of GTK+ libraries.
I do have all of the proper 32-bit versions of the libraries in my lib32 folders.
Hopefull someone has had this problem before and can help me, this is really causing me quite the headaches, and I can't fine much help any where on the net.
Please ask if there is any other information you need me to provide to help with diagnosing this problem.
Note: I do have the ia32-libs and gcc-multilib packages. Ubuntu 10.04 does not have a separate ia32-libs-gtk packages, but I think these are wrapped in to the ia32-libs packages. They all are present on my system.
I think this must be some sort of linker config problem. I've recently built the new Free Pascal compiler and a 32 bit cross compiler, and I also upgraded GCC to 4.6.2 to take advantage of some of the new C++ features and fixes to C99 support. The default 4.4.3 GCC still exists on my system. Where I think the problem has been introduced is when I installed a new binutils because I've been experimenting with Clang and LLVM as a toolchain, and I wanted and ld with plug-in capabilities, so I figured might as well upgrade them all.
Everything works fine compiling 64 bit programs, there hasn't been a single problem with the new tools at all, and I can compile 32-bit programs but when it comes time to explicitly link something in I have problems.
I know my current set of libs is appropriate, and I have Free Basic installed which only emits 32 bit code, and I was able to build 32-bit GTK+ programs no problem before this upgrade.
Just wondering if anyone has any ideas what configs might have been changed in this upgrade or has had this happen to them before? I really should upgrade to a newer distro so I can take advantage of all the new software with out have to hack up all of my packages, but unfortunatly there is a bug in the newer kernels that prevents my computer from coming back from standby, and this is a laptop I use for personal side projects, so proper power management is pretty important, and it's not a huge loss if I bork the system, other than I have it set up pretty much perfect for my workflow.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以告诉
pkg-config
使用环境变量PKG_CONFIG_PATH
搜索32位库。对于 Ubuntu:
对于 Redhat:
You may tell
pkg-config
to search for the 32-bit libraries with the environment variablePKG_CONFIG_PATH
.For Ubuntu:
For Redhat:
我认为您需要安装 ia32-libs-gtk 和
gcc-multilib
软件包,并且您需要像以前一样使用gcc -m32
进行编译和链接。I think you need to install the
ia32-libs-gtk
&gcc-multilib
packages, and you need to compile and link withgcc -m32
as you already do.12.04 中的 GTK 包似乎无法与多体系结构一起正常工作。您可以通过创建以下符号链接在 Ubuntu 12.04 上解决此问题:
我在此线程中找到了答案: http://www.blitzbasic.com/Community/posts.php?topic=101357
或者(可能更好),您可以保持基本系统不变,更新您的链接以按文件名而不是库名称进行搜索。比如:
这不太好。您必须为链接器找不到的每个库添加
-l:
,如果库文件名发生更改,您的构建将会中断。The GTK package in 12.04 doesn't seem to work correctly with multiarch. You can work around this on Ubuntu 12.04 by creating the following symlinks:
I found the answer in this thread: http://www.blitzbasic.com/Community/posts.php?topic=101357
Alternatively (probably better), you can leave the base system untouched and update your link to search by file name instead of library name. Something like:
This isn't great. You'll have to add a
-l:
for each library that the linker can't find and your build will break if the library file name ever changes.这项工作在我的 Debian 11 上安装了 multiarch gtk3-dev:i386
$ export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig; pkg-config --cflags gtk+-3.0
this work on my Debian 11 with multiarch gtk3-dev:i386 installed
$ export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig; pkg-config --cflags gtk+-3.0