Как скомпилировать на Linux, чтобы полученный исполняемый файл не требовал разделяемых библиотек - PullRequest
0 голосов
/ 13 марта 2011

Я успешно скомпилировал swftools, используя их инструкции (http://wiki.swftools.org/index.php/FAQ) на моем компьютере с Fedora 14. Я хочу использовать один из инструментов (pdf2swf) на другом компьютере с Linux. Когда я перемещаю его и запускаю на другом компьютере, он запрашиваетнекоторые общие библиотеки. Можно ли скомпилировать swftools (в частности, pdf2swf), чтобы при запуске его на другом компьютере с Linux он не запрашивал какие-либо общие библиотеки? Это нормально, если сам исполняемый файл больше по размеру, насколько онможет работать независимо.

Я новичок в Linux, поэтому, если что-то требует дополнительных знаний, укажите мне соответствующий онлайн-ресурс.

С уважением

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

это тривиально: ссылка с -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 голос
/ 13 марта 2011

Хорошо, вам нужны статически связанные библиотеки, а не динамически / разделяемые библиотеки.

Вам необходимо скомпилировать приложение и связать его статически. Если вы используете gcc, вы можете применить статический переключатель к вашему вызову компилятора:

gcc -static <and the whole gcc shebang>

В большинстве случаев вы можете редактировать make-файл (ищите CC-определение или CC_ARGS что-то в этом роде) и просто включите статический переключатель, как указано выше.

...