Как определить правильные заголовочные файлы при сборке gcc из исходных файлов (libstdc ++ - v3 build) - PullRequest
0 голосов
/ 16 февраля 2019

Я новичок в сборке gcc из исходных файлов.Я строю кросс-компиляторную версию этого для QNX.

Часть процесса состоит в том, чтобы модифицировать build_hooks с информацией о версии QNX и некоторой информацией о пути.

Я нахожусь в той точке процесса, где строится libstdc ++ - v3.Кросс-компилятор работает нормально и используется для сборки исходных текстов libstdc ++.

Он движется нормально, пока не начнет включать заголовочные файлы, такие как math.h.В частности, это здание complex_io.c.Он включает в себя cmath, который выполняет #include_next "math.h"

. В этот момент появляется ряд переопределений ошибок функций, например:

In file included from /home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/complex:44,
                 from ../../../../../libstdc++-v3/src/c++98/complex_io.cc:25:
/home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/cmath:80:3: error: redefinition of 'double std::abs(double)'
   abs(double __x)
   ^~~
In file included from /home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/cmath:36,
                 from /home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/complex:44,
                 from ../../../../../libstdc++-v3/src/c++98/complex_io.cc:25:
/opt/qnx660/target/qnx6/usr/include/math.h:720:15: note: 'double std::abs(double)' previously defined here
 inline double abs(double _Left) // OVERLOADS
               ^~~

Построение крестакомпилятор вызвал пути поиска к базовой установке файлов заголовков QNX (/ opt / qnx660 / target / qnx6 / usr / include), и, таким образом, когда cmath выполняет #include_next "math.h", включаемый файл math.h происходит изэтот путь к каталогу.

Я пытаюсь понять, где находится правильный файл math.h, расположенный в дереве исходного кода libstdc ++ - v3?Есть несколько вариантов на выбор, и я пока не смог выбрать правильный.

./fixincludes/tests/base/ansi/math.h
./fixincludes/tests/base/architecture/ppc/math.h
./fixincludes/tests/base/math.h
./libstdc++-v3/include/tr1/math.h
./libstdc++-v3/include/c_compatibility/math.h
./linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/tr1/math.h
./linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/pic/libstdc++-v3/include/tr1/math.h

Даже если бы я знал, какой из них был правильным, я также не уверен, как настроить сборку так, чтобыон выбирает правильный math.h, не взламывая ни один из автоматически сгенерированных Makefile.

Идеи?

Спасибо, Кевин

1 Ответ

0 голосов
/ 17 февраля 2019

Предполагается, что компилятор C ++ может использовать системный файл math.h, предоставленный (или для использования с) компилятором C.Однако, похоже, что у math.h есть некоторые биты в стиле C ++ в пространстве имен std (основанные на комментарии // OVERLOADS), и это сбивает с толку реализацию libstdc ++.

Вам нужно посмотреть, чтоваша копия math.h определяет.Может быть, есть опция препроцессора, которую вы можете использовать, чтобы отключить эти определения C ++.Тогда вы можете установить его до директивы #include_next.Или, поскольку ваш заголовок math.h, очевидно, уже поддерживает C ++, возможно, можно удалить определения функций abs и modf из libstdc++-v3/include/c/cmath.

Учитывая эти проблемы, я ожидал бычто потребуется больше усилий для переноса.

...