Как кросс-компилировать libiconv для ARM Cortex M? Синтаксические ошибки в сгенерированных файлах

Я пытаюсь создать libiconv как статическую библиотеку для Cortex M4, используя набор инструментов GNU ARM, и кажется, что процесс в основном успешен.

Я настраиваю libiconv таким образом:

./configure --build=x86_64-linux-gnu --host=arm-none-eabi --prefix=/home/josaphat/Downloads/libiconv-1.14/build_dir CFLAGS="-nostdlib -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mthumb -mfloat-abi=hard" --enable-static

Configure не показывает никаких предупреждений или ошибок, которые я могу различить, кроме «ПРЕДУПРЕЖДЕНИЕ: использование кросс-инструментов без префикса с триплетом хоста» (но он отлично находит и использует правильный компилятор, поэтому я полагаю, что могу спокойно игнорировать это).

Ошибки возникают при компиляции sigprogmask.c:

[...отрезать...]

arm-none-eabi-gcc -DHAVE_CONFIG_H -DEXEEXT=\"\" -I. -I.. -I../lib  -I../intl -DDEPENDS_ON_LIBICONV=1 -DDEPENDS_ON_LIBINTL=1   -nostdlib -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mthumb -mfloat-abi=hard -c sigprocmask.c
In file included from /usr/local/gcc-arm-none-eabi-4_8-2014q2/arm-none-eabi/include/signal.h:5:0,
                 from ./signal.h:52,
                 from sigprocmask.c:44:
./signal.h:490:1: error: expected identifier or '(' before 'const'
 _GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
 ^
./signal.h:490:1: error: expected ')' before '&' token
 _GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
 ^
./signal.h:490:1: error: expected ')' before '!=' token
 _GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
 ^
./signal.h:503:1: error: expected ')' before '*' token
 _GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
 ^
./signal.h:503:1: error: expected ')' before '=' token
 _GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
 ^
./signal.h:515:1: error: expected ')' before '*' token
 _GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig)
 ^
./signal.h:515:1: error: expected ')' before '|=' token
 _GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig)
 ^
./signal.h:528:1: error: expected ')' before '*' token
 _GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig)
 ^
./signal.h:528:1: error: expected ')' before '&=' token
 _GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig)
 ^
./signal.h:541:1: error: expected ')' before '*' token
 _GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
 ^
./signal.h:541:1: error: expected ')' before '=' token
 _GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
 ^
sigprocmask.c:87:14: error: expected identifier or '(' before 'const'
 sigismember (const sigset_t *set, int sig)
              ^
sigprocmask.c:87:1: error: expected ')' before '&' token
 sigismember (const sigset_t *set, int sig)
 ^
sigprocmask.c:87:1: error: expected ')' before '!=' token
 sigismember (const sigset_t *set, int sig)
 ^
sigprocmask.c:103:23: error: expected ')' before '*' token
 sigemptyset (sigset_t *set)
                       ^
sigprocmask.c:103:1: error: expected ')' before '=' token
 sigemptyset (sigset_t *set)
 ^
sigprocmask.c:110:21: error: expected ')' before '*' token
 sigaddset (sigset_t *set, int sig)
                     ^
sigprocmask.c:110:1: error: expected ')' before '|=' token
 sigaddset (sigset_t *set, int sig)
 ^
sigprocmask.c:130:21: error: expected ')' before '*' token
 sigdelset (sigset_t *set, int sig)
                     ^
sigprocmask.c:130:1: error: expected ')' before '&=' token
 sigdelset (sigset_t *set, int sig)
 ^
sigprocmask.c:151:22: error: expected ')' before '*' token
 sigfillset (sigset_t *set)
                      ^
sigprocmask.c:151:1: error: expected ')' before '=' token
 sigfillset (sigset_t *set)
 ^
make[2]: *** [sigprocmask.o] Error 1

[... так далее....]

Я в недоумении. Я попытался опустить флаг «nostdlib», но затем шаг настройки завершился неудачей, потому что компилятор не может найти _exit (я собираю цель без ОС, так что это имеет смысл). Так чего же мне не хватает? Зависит ли libiconv от чего-то, что удаляет -nostdlib? Если да, то как это объясняет тот факт, что это явно синтаксические ошибки?

Итак, я думаю, мой вопрос сводится к следующему: возможно ли вообще собрать libiconv для системы без ОС? И если да, то как мне преодолеть это текущее препятствие?


person josaphatv    schedule 27.08.2014    source источник
comment
почему ваш вариант сборки использует x86-64, а вы хотите скомпилировать его? Я думаю, что это связано с определением макросов. вам нужно правильно настроить параметр компиляции.   -  person Jason Hu    schedule 27.08.2014
comment
Потому что я собираю компьютер x86_64 Ubuntu для Cortex M4. Это определенно относится к определению макроса, потому что это часть, которая не работает. Не могли бы вы уточнить, что означает правильно?   -  person josaphatv    schedule 27.08.2014
comment
это что значит сборка? возможно, вам следует прочитать документацию, но, насколько я понимаю, вариант сборки должен быть целевой архитектурой. мне интересно, если документация покажет вам, как это сделать шаг за шагом.   -  person Jason Hu    schedule 27.08.2014
comment
Да. gnu.org/software/automake/manual/html_node/   -  person josaphatv    schedule 27.08.2014
comment
Это похоже на код обработки сигналов (который во многом зависит от ОС) — является ли этот файл частью самой библиотеки libiconv или программы iconv, которая также является частью пакета?   -  person Notlikethat    schedule 30.08.2014
comment
Он находится в каталоге srclib пакета с исходным кодом. Я недостаточно знаю, как работает программа, чтобы знать, является ли она частью libiconv или iconv. Я знаю, что все эти файлы генерируются автоматически (поэтому я не могу просто войти и напрямую исправить исходный код, чтобы он работал на меня).   -  person josaphatv    schedule 02.09.2014


Ответы (1)


Я столкнулся с той же проблемой. Я не нашел чистого способа настройки, но мне удалось скомпилировать библиотеку с помощью

1) редактирование scrlib/signals.h и изменение определений перед ошибками 0->1, например:

/* Test whether a given signal is contained in a signal set.  */
# if 1
/* This function is defined as a macro on MacOS X.  */

Скорее всего, закомментирование этих частей в signal.h также сработает.

2) комментирование функций в scrlib/sigprocmask.c

Они необходимы для инструмента командной строки, библиотека нормально компилируется без них.

person Pertti Kasanen    schedule 18.02.2015