Не может компилировать статически программы

Я пытаюсь создать кросс-компилятор для ARM и не добиваюсь успеха с Clang и LLVM, слишком много вещей, которые нужно сделать, чтобы моя машина сделала свое дело. Итак, я пошел на веб-страницу для LinuxKD, чтобы получить clang и LLVM для правильной сборки, что я и сделал, и они работают.. Итак, я вернулся на тот же сайт (LinuxKD), чтобы узнать, как создать кросс-компилятор для ARM, и он использует "Crosstool-ng", что хорошо со мной.. Я загрузил более позднюю версию, чем показано на веб-сайте, он использует crosstool-ng-1.12.0, а я использую crosstool-ng-1.19.0... Итак, он начинает делать свое дело после настройка, но это происходит со следующей ошибкой:

[DEBUG]  Checking that gcc can compile a trivial statically linked program   (CT_WANTS_STATIC_LINK)
[DEBUG]    You may need to ensure that static libraries such as libc.a are installed on your system
[DEBUG]    ==> Executing: 'x86_64-build_unknown-linux-gnu-gcc' '-O2' '-g' '-pipe' '/home/cctools/arm/.build/arm-unknown-eabi/build/test.c' '-static' '-o' '/home/cctools/arm/.build/arm-unknown-eabi/build/.gccout' 
[DEBUG]    /usr/bin/ld: cannot find -lc
[ERROR]    collect2: error: ld returned 1 exit status
[ERROR]  
[ERROR]  >>
[ERROR]  >>  Build failed in step 'Checking that gcc can compile a trivial statically linked program (CT_WANTS_STATIC_LINK)'
[ERROR]  >>        called in step '(top-level)'
[ERROR]  >>
[ERROR]  >>  Error happened in: CT_DoExecLog[scripts/functions@257]
[ERROR]  >>        called from: main[scripts/crosstool-NG.sh@540]
[ERROR]  >> 

Моя система - Fedora 20, работающая на Asus I7. В ней говорится, что /usr/bin/ld: не может найти -lc,, -lc - это программа или подчиненная инструкция программы Ld, или это что-то еще?? Или я пропускаю программу?? Что-то вроде Glibc, который у меня есть последний для этого Fedora 20 Linux..

СПАСИБО Марти

1 ответ

В Fedora 19 и 20 для статической компиляции программ на C вам необходимо установить пакеты glibc-devel а также glibc-static,

sudo yum install glibc-devel glibc-static

Чтобы показать, что это работает потом:

cat > hello.c <<'EOF'
#include <stdio.h>
int main(int argc, char **argv)
{
    puts("Hello, world.");
    return 0;
}
EOF

gcc -o hello hello.c -static
ldd hello
./hello

должен напечатать:

   not a dynamic executable
Hello, world.

В моем случае -lc ошибка на этапе привязки произошла из-за libc.a быть 32-битным ELF, поэтому невозможно связать скомпилированный 64-битный объект.

check it with:<br>
"#file {build_path}/x86_64-linux-gnu/sysroot/usr/lib/libc.a"  or<br>
"#file {build_path}/x86_64-linux-gnu/sysroot/usr/lib/libc.so"
Другие вопросы по тегам