如何在linux上编译,以便生成的可执行文件不需要共享库

时间:2011-03-12 21:51:18

标签: linux compilation compatibility

我在Fedora 14计算机上使用他们的指令(http://wiki.swftools.org/index.php/FAQ)成功编译了swftools。我想在另一台Linux机器上使用其中一个工具(pdf2swf)。当我移动它并在另一台机器上运行它时,它会要求一些共享库。是否可以编译swftools(特别是pdf2swf),这样当我在另一台Linux机器上运行它时,它不会要求任何共享库?如果可执行文件本身的大小更大,可以独立运行。

我是Linux新手,所以如果需要高级知识,请指向相应的在线资源。

此致

2 个答案:

答案 0 :(得分:2)

它很简单:与-static链接。当然,这意味着您需要安装静态库。链接器(通常通过cc调用)只是在两者都可用时默认使用共享库。

[hahn@box ~]$ cat hello.c
#include <stdio.h>
int main() {
    printf("Hello, world!\n"); 
    return 0; 
}
[hahn@box ~]$ cc hello.c -o hello
[hahn@box ~]$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
[hahn@box ~]$ ldd hello
        linux-gate.so.1 =>  (0x00205000)
        libc.so.6 => /lib/libc.so.6 (0x00697000)
        /lib/ld-linux.so.2 (0x005b4000)
[hahn@box ~]$ cc hello.c -o hello -static
[hahn@box ~]$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, not stripped
[hahn@box ~]$ ldd hello
        not a dynamic executable
[hahn@box ~]$ ./hello
Hello, world!

为了使这项工作,我需要安装glibc-static,默认情况下不安装(至少在这个盒子上,这是Fedora14)。某些包允许您在./configure级别选择静态链接,否则您可能需要修改Makefile。

答案 1 :(得分:1)

嗯,你想要的是静态链接库,而不是动态/共享库。

您需要编译应用程序并静态链接它。如果使用gcc,可以将静态开关应用于编译器的调用:

gcc -static <and the whole gcc shebang>

大多数时候你可以编辑makefile(查找CC定义或CC_ARGS之类的东西)并且只包括上面的静态开关。