Итак, у меня есть настройка проекта, похожая на эту:
myfile.cpp
, которая включает в себя:
Где myfile - это файл C ++, а fsl_clock.h - это чистый заголовочный файл C из NXP, где можно увидеть его версию здесь
Мой файл выглядит так:
#include "fsl_clock.h"
Теперь у меня есть больше материала в моем файле, но я опустошил его, пока не остался только с этим.
Вот компиляции, которые я пробовал вместе с результатами:
- С кросс-компилятором arm
arm-none-eabi-g++
это прекрасно скомпилируется. - С хостом (x86Linux) g ++ --version
7.3.0-16ubuntu3
работает нормально - С хостом (x86Linux) g ++ --version
7.3.0-27ubuntu1~18.04
выдает множество странных ошибок.
Я получаю следующие ошибки:
device/MIMX8MQ6_cm4.h8856:51: error 'reinterpret_cast<CMM_Type*>(808976384)' is not a constant expression
Где строка кода - чистый C и выглядит так:
kCLOCK_RootM4 = (uint32_t)(&(CCM)->ROOT[1].TARGET_ROOT)
Где CCM определяется как:
#define CCM_BASE (0x30380000u)
#define CCM ((CCM_Type*)CCM_BASE)
Таким образом, похоже, что более новый g ++ 7.3.0-27ubuntu1~18.04
(возможно, правильно) выполняет вещи на языке c ++ (например, reinterpret_cast
) во включенном коде заголовка в стиле C.Старый компилятор 7.3.0-16ubuntu3
ведет себя не так - и компиляция идет нормально.
Кто-нибудь может сказать, в чем разница между двумя компиляторами и почему один работает, а другой нет?Оба компилятора gnu g ++ имеют одинаковую версию g ++ 7.3.0.Но я не совсем понимаю суффикс 16ubuntu3
против 27ubuntu1~18.04
и почему это может изменить поведение ...
Примечание Теперь я знаю, что для моей сборки хоста я нена самом деле не хочу включать в сборку хоста специфичный для платы код, но это другой вопрос.Сейчас меня больше интересует понимание того, почему между двумя компиляторами есть разница.
Обновление
Для сборки хоста строка компилятора выглядит следующим образом:
g++ -w -Isource/drivers -Isource/board -Isource/device -m32 -g -std=c++11 -c source/myfile.cpp -o out.o
CMM_Type (необходимо вручную скопировать его, поскольку оригинал похоронен на веб-сайте NXP) выглядит (обратите внимание, что его сокращенно, потому что копировать слишком много - но его структуры из uint32_t):
typedef struct {
volatile uint32_t GPR0;
volatile uint32_t GPR0_SET;
struct {
:
} PLL_CTRL[39];
:
struct {
volatile uint32_t TARGET_ROOT;
volatile uint32_t TARGET_ROOT_SET;
volatile uint32_t TARGET_ROOT_CLR;
:
} ROOT[142];
} CCM_Type;
Минимальный пример - онлайн GDB Я сделал минимальный пример - он не компилируется с онлайн GDB, но он выдает ошибки, которые я объяснил на моем компиляторе.Ссылка здесь
Минимальная - Wandbox Точно такой же код, как и в примере с GDB онлайн, но на самом деле отображается та же ошибка, что и я: здесь
Минимальный пример кода
#include <stdint.h>
typedef struct {
struct {
volatile uint32_t TARGET_ROOT;
} ROOT[4];
} CCM_Type;
#define CCM_BASE (0x30380000u)
#define CCM ((CCM_Type *)CCM_BASE)
typedef enum _clock_root_control
{
kCLOCK_RootM4 = (uint32_t)(&(CCM)->ROOT[1].TARGET_ROOT)
} clock_root_control_t;
int main()
{
return 0;
}