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

问题描述:

我在编译64位Linux上的32位GTK +应用程序时遇到了一些麻烦,特别是Ubuntu 10.04。编译64位GTK +应用程序可以正常工作,并且所有设置都可以编译32位应用程序,但它不适用于GTK +编译64位Linux的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 +程序没有任何问题。

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

我认为你需要安装ia32-libs-gtk & gcc-multilib包,你需要编译并链接gcc -m32就像你已经做的那样。

12.04中的GTK包似乎不能正确处理多元化。您可以通过创建下面的符号链接解决这个在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:,并且如果库文件名称发生更改,则您的构建将会中断。

您可以告诉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