Как кросс-компилировать libiconv для ARM Cortex M? Синтаксические ошибки в сгенерированных файлах
Я пытаюсь собрать libiconv в качестве статической библиотеки для Cortex M4, используя GNU ARM Toolchain, и кажется, что процесс в основном успешен.
Я настраиваю 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
:
[... snip...]
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 для системы без ОС? И если да, то как мне преодолеть это нынешнее препятствие?
1 ответ
Я наткнулся на ту же проблему. Я не нашел чистого способа настройки, но мне удалось скомпилировать библиотеку с
1) редактирование scrlib/signal.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
Они необходимы для инструмента командной строки, библиотека без проблем компилируется.