Не может компилировать статически программы
Я пытаюсь создать кросс-компилятор для 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"