Я пытаюсь скомпилировать простую программу в статический исполняемый файл:

$ cat hello.c
#include <stdio.h>
int main() {
    puts("Hello, world!");
}

Однако я столкнулся со следующей ошибкой:

$ gcc -static hello.c -o hello
/nix/store/p792j5f44l3f0xi7ai5jllwnxqwnka88-binutils-2.31.1/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
1
NieDzejkob 21 Окт 2020 в 16:53
У меня нет правильного ответа, но для полностью статических сборок я бы посоветовал изучить наш атрибут pkgsStatic. Многие пакеты уже просто работают, просто собирая, например. атрибут pkgsStatic.hello.
 – 
Vladimír Čunát
21 Окт 2020 в 22:20

1 ответ

Это связано с тем, что статическая библиотека предоставляется отдельно в nixpkgs. Попробуй это:

$ nix-shell -p gcc glibc.static
these paths will be fetched (1.37 MiB download, 9.12 MiB unpacked):
  /nix/store/7q44r8ps2yv9zr1bxhff49xb6hh3xrnn-glibc-2.31-static
copying path '/nix/store/7q44r8ps2yv9zr1bxhff49xb6hh3xrnn-glibc-2.31-static' from 'https://cache.nixos.org'...

[nix-shell:~]$ gcc -static hello.c -o hello

Конечно, если вам часто нужны статические библиотеки, вы можете добавить этот пакет в свою конфигурацию.

1
NieDzejkob 21 Окт 2020 в 16:53
1
AFAIK glibc не полностью поддерживает статическую компоновку (т.е. это немного глючит или что-то в этом роде), но это не относится к Nix(OS)...
 – 
Vladimír Čunát
21 Окт 2020 в 22:00