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

时间:2011-11-24 14:39:41

标签: c linux linker 32bit-64bit gtk

我在64位Linux上编译32位GTK +应用程序时遇到了一些麻烦,特别是Ubuntu 10.04。编译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位版本的文件。

Hopefull之前有人遇到过这个问题并且可以帮助我,这真的让我很头疼,而且我对网上任何地方的帮助都不大。

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

注意:我有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位程序,但是当我需要明确地链接某些内容时,我会遇到问题。

我知道我当前的一组lib是合适的,我安装了Free Basic,它只发出32位代码,而且在升级之前我能够构建32位GTK +程序没问题。

只是想知道是否有人有任何想法在这次升级中可能已经改变了什么配置或者之前发生过这种情况?我真的应该升级到一个较新的发行版,这样我就可以利用所有新软件而不得不破解我的所有软件包,但不幸的是,新内核中存在一个错误,导致我的计算机无法从待机状态恢复,这是我用于个人项目的笔记本电脑,所以正确的电源管理非常重要,如果我把系统搞砸了,这不是一个巨大的损失,除了我设置的工作流程非常完美。

3 个答案:

答案 0 :(得分:0)

我认为您需要安装ia32-libs-gtk& gcc-multilib个软件包,您需要像现在一样编译并链接gcc -m32

答案 1 :(得分:0)

12.04中的GTK包似乎与multiarch无法正常工作。您可以通过创建以下符号链接在Ubuntu 12.04上解决此问题:

sudo ln -s /lib/i386-linux-gnu/libglib-2.0.so.0 /usr/lib32/libglib-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 /usr/lib32/libgtk-x11-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0 /usr/lib32/libgdk-x11-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libatk-1.0.so.0 /usr/lib32/libatk-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libpangox-1.0.so.0 /usr/lib32/libpangox-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libpango-1.0.so.0 /usr/lib32/libpango-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 /usr/lib32/libgmodule-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 /usr/lib32/libgobject-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0 /usr/lib32/libgdk_pixbuf-2.0.so

我在这个帖子中找到了答案:http://www.blitzbasic.com/Community/posts.php?topic=101357

或者(可能更好),您可以保持基本系统不变,并更新链接以按文件名而不是库名进行搜索。类似的东西:

gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` -L/usr/lib/i386-linux-gnu -l:libgio-2.0.so.0 ...

这不是很好。您必须为链接器找不到的每个库添加-l:,如果库文件名发生更改,您的构建将会中断。

答案 2 :(得分:0)

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

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

对于Redhat,

export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH
相关问题