Отсутствует что-то в руке g ++ - PullRequest
1 голос
/ 27 июня 2011

Я установил набор инструментов CodeSourcery g ++ и попытался скомпилировать простую программу hello world:

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World" << endl;
    return 0;
}

И получил много ошибок от компоновщика

$ arm-none-eabi-g++ helloworld.cpp -o helloworld.exe
bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000008018
lib/libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text.abort+0x10): undefined reference to `_exit'
lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
lib/libc.a(lib_a-openr.o): In function `_open_r':
openr.c:(.text._open_r+0x20): undefined reference to `_open'
lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
lib/libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text._kill_r+0x1c): undefined reference to `_kill'
lib/libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x4): undefined reference to `_getpid'
lib/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x20): undefined reference to `_write'
lib/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'
lib/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
lib/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'
lib/libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x20): undefined reference to `_read'
collect2: ld returned 1 exit status

Какую библиотеку мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Набор инструментов GCC - это только половина того, что вам нужно для создания рабочего исполняемого файла *. Другая половина - библиотека времени выполнения. Среда выполнения включает в себя crt0.o, который содержит точку входа (код, вызывающий main ()), и, как правило, libc, который содержит стандартные функции C (strcmp (), memcpy () и т. Д.), А также системные вызовы ( open (), read () и другие). Вам нужно найти источник для этого. Если вы нацелены на встраиваемый компьютер с Linux или BSD, вам необходимо выяснить, какой libc использует ваша цель. Вероятно, это либо GNU libc, BSD libc, newlib, либо uclibc. Вы можете получить их и собрать их самостоятельно, или они могут быть доступны уже с вашей ОС.

*, если вы не создаете автономный бинарный файл, но это не похоже на то, что вы делаете.

0 голосов
/ 16 октября 2013

Основываясь на кросс-компиляторе, кажется, что конечной целью является голый металл. Библиотеки gcc по умолчанию (в зависимости от ОС) здесь работать не будут. Вы можете использовать NewlibC или NewlibC-Nano. Обычно он поставляется вместе с цепочкой инструментов кросс-компилятора.

Найдите папку lib, в которой предварительно скомпилирован NewlibC.

Как только это будет сделано,

Это утверждение может вам в определенной степени помочь.

arm-none-eabi-gcc --specs=rdimon.specs \
         -Wl,--start-group -lgcc -lc -lc -lm -lrdimon -Wl,--end-group $(OTHER_OPTIONS)

Не забудьте указать путь поиска библиотек -L (путь).

...