我使用GNAT在Ubuntu上编译了一个Ada程序。
之后,我尝试了一些使用该程序的测试,并且它运行正常。
但是当我将其上传到我的Apache(UNIX)网络服务器并尝试运行该程序时,没有输出。为什么会这样?
可能是在Ubuntu上编译的程序在UNIX服务器上不起作用吗?
(抱歉这个愚蠢的问题!)
我用于编译的系统的Linux版本(uname -a):
Linux ubuntu 3.0.0-12-generic #20-Ubuntu x86-64 GNU/Linux
系统的Linux版本我想稍后运行该程序(uname -a):
Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux
为了在Ubuntu机器上进行编译,我使用:
gnatmake -O3 myprogram -bargs -static
答案 0 :(得分:7)
构建GNAT程序(gnatmake my_program
)时,默认情况下会链接动态库(libgnat.so
,libgnarl.so
)。这些库是GNAT系统的一部分,不太可能在您的Web服务器上使用。
如果你说ldd my_program
它将显示使用的共享库。
您可以通过说
强制构建使用静态GNAT库gnatmake my_program -bargs -static
(-bargs -static
必须在-O2
之类的常规标记之后。
答案 1 :(得分:1)
您必须确保服务器具有您的应用链接的库,或者像其他人已建议的那样静态链接它们。其他一些评论指出你需要“交叉编译”或者服务器不会运行64位二进制文件。除非您正在构建的应用程序非常复杂,否则这很容易解决。
gnatmake --GCC ='gcc -m32'
将制作一个可在32位系统上运行的二进制文件。然而,主要的问题是服务器(g)libc很可能比你的ubunu盒上的更旧。针对较新的glibc编译的程序不一定在安装了旧glibc的系统上运行。
了解更多信息和更多链接,请点击此处:
Linking against an old version of libc to provide greater application coverage
How can I link to a specific glibc version?
编辑: 此外,apache可能未配置为接受外部二进制文件的调用。您是否“尝试使用您知道存在于服务器上的程序来运行程序”?尝试运行像/ bin / ls这样的小事来确保运行程序的方法有效。如果日志不起作用,请查看日志。顺便说一下,程序需要是可执行的:chmod 755 / path / to / webeserver / uploads / ada-app
答案 2 :(得分:0)
为什么不在Web服务器而不是本地计算机上编译它?
Aswell cat /etc/issue
或cat /etc/release
可以向我们提供有关您正在使用的分发的一些信息。