Как статически связать CRT с GCC?

Как можно было бы статически связать CRT в Windows / macOS и Linux с помощью GCC?


person Community    schedule 18.08.2009    source источник


Ответы (1)


Просто используйте параметр компоновщика -static, как показано ниже.

edd@ron:/tmp$ cat helloworld.c
#include <stdio.h>

int main(void) {
    printf("Hello, world\n");
}
edd@ron:/tmp$ gcc -o helloworld.dyn helloworld.c
edd@ron:/tmp$ gcc -static -o helloworld.static helloworld.c
edd@ron:/tmp$ ls -l helloworld.*
-rw-r--r-- 1 edd edd     69 2009-08-18 07:09 helloworld.c
-rwxr-xr-x 1 edd edd   6667 2009-08-18 07:10 helloworld.dyn
-rwxr-xr-x 1 edd edd 576348 2009-08-18 07:10 helloworld.static
edd@ron:/tmp$ ./helloworld.dyn
Hello, world
edd@ron:/tmp$ ./helloworld.static
Hello, world
edd@ron:/tmp$ ldd helloworld.static
        not a dynamic executable
edd@ron:/tmp$ ldd helloworld.dyn
        linux-gate.so.1 =>  (0xb7efc000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7d83000)
        /lib/ld-linux.so.2 (0xb7efd000)
edd@ron:/tmp$
person Dirk Eddelbuettel    schedule 18.08.2009
comment
Не будет работать для MinGW в Windows. Насколько я знаю, невозможно избежать зависимости от MSVCRT.DLL с помощью MinGW, хотя я был бы рад оказаться неправым. - person ; 18.08.2009
comment
Ах да, та самая другая ОС. Ну, по крайней мере, я покрыл два из трех. - person Dirk Eddelbuettel; 18.08.2009
comment
Я пытался связать без -static, я использую MinGW на Win7, и он создает 2 разных файла (статический на 1,5 месяца больше). Я совсем не спец, но думаю работает нормально... - person johan d; 19.07.2013