Сегодня я встретил действительно интересную проблему с моим дистрибутивом NixOS. Я просто хотел создать статически скомпилированную программу ocaml и не мог этого сделать. затем я попытался сделать это с помощью ANSI C canonical toy test "hello world!" приложение:
$> cat mytest.c
#include <stdio.h>
int
main ()
{
puts ("hello world!") ;
}
мой дистрибутив:
$> uname -a
Linux cat 4.19.36 #1-NixOS SMP Sat Apr 20 07:16:05 UTC 2019 x86_64 GNU/Linux
компилятор:
$> gcc -v
Using built-in specs.
COLLECT_GCC=/nix/store/myq0x6mjbdzxr9fckqn6kgy89kz19nkp-gfortran-7.4.0/bin/gcc
COLLECT_LTO_WRAPPER=/nix/store/myq0x6mjbdzxr9fckqn6kgy89kz19nkp-gfortran-7.4.0/libexec/gcc/x86_64-unknown-linux-gnu/7.4.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with:
Thread model: posix
gcc version 7.4.0 (GCC)
не может создавать stati c exe c:
$> gcc -static mytest.c -o hello
/nix/store/0y7jmqnj48ikjh37n3dl9kqw9hnn68nq-binutils-2.31.1/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
любые идеи?
обычная «динамически связанная» программа hello g cc генерирует - нет проблем
нет проблем с такими вещами в Lubuntu. Мне посоветовали сделать это в другом дистрибутиве и проверить, работает ли exe c на NixOS. Я сделал это - создал exe c с g cc на Lubuntu и запустил его на NixOS. поэтому я думаю, что дело не в g cc, а в NixOS
, как NixOS решает эту проблему - генерацию статически скомпилированных файлов exe c?
и, конечно, меня интересуют результаты, касающиеся ocamlopt компилятора, а не g cc, но я думаю, что проблема общая для всех компиляторов (я тоже пробовал haskell gh c кстати - с тем же результатом)
brgs
UDP: из обсуждения в другой ветке:
1 @Ston17 You may have the .so but not the .a – norok2
2
3 yes - i have .so what the difference? can the presence of .a improve the situation? – Ston17
4
5 Yes. You typically need .a library to have the static linking work correctly – norok2
$> find /nix/store/ -name *libc.a.*
$>
может это быть причиной?
UPD2: что касается ocamlopt:
исходный файл
$> cat mytest.ml
print_string "hello world!" ;;
print_newline () ;;
так как вы не видите никаких специальных вызовов ни к чему. давайте попробуем сделать stati c exe c:
$> ocamlopt -ccopt -static mytest.ml -o ocaml_test
/nix/store/0y7jmqnj48ikjh37n3dl9kqw9hnn68nq-binutils-2.31.1/bin/ld: cannot find -lm
/nix/store/0y7jmqnj48ikjh37n3dl9kqw9hnn68nq-binutils-2.31.1/bin/ld: cannot find -ldl
/nix/store/0y7jmqnj48ikjh37n3dl9kqw9hnn68nq-binutils-2.31.1/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
, поэтому ld просто не может ссылаться на stati c версию lib c. и я не могу найти lib c .a в дырочной системе
какие-либо предложения?