在另一个发行版中运行C可执行文件

时间:2011-11-14 20:24:33

标签: c linux gcc cross-platform gsl

我有一个C程序,我正在使用Ubuntu 11.10(Linux版本3.0.0-12-generic-pae内核)进行开发。我需要在安装了Debian 3.1(Linux版本2.4.24-om2)的集群中运行该程序,并使用Intel(R)Pentium(R)4 CPU 3.20GHz处理器。

问题是我无法在Debian集群中编译,因为它没有安装我的程序需要的GSL库,而且我不知道如何在没有root的情况下安装它(或者使用它)特权。

如果我尝试运行我在Ubuntu中编译的可执行文件(或简单的 hello world 程序,对于这种情况),它就不起作用,即使我使用所有gcc选项进行编译这在集群上执行时抛出:

gcc --save-temps -fverbose-asm hello_world.c -o hello_world

当我尝试执行在Ubuntu中编译的程序时,它会抛出:

floating point exception

更新:当我使用-static标志编译时,我得到的错误是:

FATAL: kernel too old
Segmentation fault.

所以我可以做一些比重新实现我正在使用的GSL的所有功能更好的东西。

5 个答案:

答案 0 :(得分:1)

我不知道你所面临的 notwork 是什么,但我唯一能想到它并不涉及交叉编译的是添加-staticgcc行。

答案 1 :(得分:1)

如果您的代码实际上正在运行并且在调用main()之前没有死亡,那么在代码中放置一些调试输出语句以确切知道代码失败的位置会很有用。

为了使您的可执行文件尽可能便携,您可能希望将其设置为静态链接。这样它就不会有很多外部依赖。当然,可执行文件的大小会有所增长。如果仍然无效,请确保要编译的体系结构与群集运行的体系结构相同。也就是说,群集是运行64位Intel-ish处理器吗?或者它可能是sparc还是什么?

即使使用静态编译,您也不是完全可移植的。如果你能弄清楚集群上运行的glibc版本并构建你的应用程序,你会有更好的运气。如果您可以使用群集上相同版本的gcc构建应用程序,那么您将更安全。基本上,您希望您的工具链尽可能与集群系统的工具链相似。

更新:好的,所以你的问题几乎可以肯定是你正在编译的glibc太新了,无法运行2.4内核。这并不奇怪。可以通过执行我在上一段中所说的来解决这个问题,但是可以用编译器标志来做到这一点。我找到了this question,它谈到了gcc的--enable-kernel=VERSION选项。但是,我没有使用此选项的经验。

答案 2 :(得分:1)

如果错误

  

致命:内核太旧了

     

分段错误。

继续。检查在主机上运行的linux的内核版本以及使用

创建的可执行文件所需的支持版本
  

ldd'可执行'

答案 3 :(得分:0)

Linux中的可移植性存在几个问题。内核ABI正在发生变化,库和工具链正在从发行版发布到发行版,从发行版发布到发布版。

最可靠的方法是在旧系统(或基于旧版Linux的chroot环境)上编译代码,因为Linux通常是向后兼容的。

另外,我建议您阅读文章Portable Linux Binaries

答案 4 :(得分:0)

最后,我解决了它编译没有root权限的GSL库。 我解压缩了主目录中的文件夹中的源代码,创建了一个_build目录,然后运行../configure,然后生成。

我将在_build中创建的.libs目录的文件复制到新的〜/ path / lib目录中,并使用:

find -name "*.h" -type f -exec cp {} ~/path/include/gsl \;

复制GSL源文件夹中生成的所有头文件(当然有更好的方法)。

然后我尝试为gcc(C_INCLUDE_PATH,LIBRARY_PATH)设置环境变量,但由于某种原因我无法保存它们(使用和导出,试图在〜/ profile和〜/ .bash_profile文件中更改它们)。

所以,我使用了-I和-L gcc选项来链接这两个文件夹。它以这种方式工作。