Isystem принудительно связывает заголовок с CC++

Программы на C++. Форум разработчиков
Anonymous
Isystem принудительно связывает заголовок с C

Сообщение Anonymous »

Это похоже на - но отличается от - Почему OpenBSD G++ делает системные заголовки по умолчанию связями C? Это не BSD, а кросс-компилятор Arm g++.
С этой тривиальной парой исходных файлов -
mbed/can .h

Код: Выделить всё

template  void ftest2(T t) { }
src/outer.cpp

Код: Выделить всё

template  void ftest0(T t) { }
#include 
template  void ftest1(T t) { }
Следующая команда завершается с ошибкой:

Код: Выделить всё

/arm-none-eabi-gcc/7.3.1-1.2.2/.content/bin/arm-none-eabi-g++ \
-isystem"mbed" \
-c "src/outer.cpp"

In file included from src/outer.cpp:2:0:
mbed/can.h:1:1: error: template with C linkage
template  void ftest2(T t) { }
Это очень странно, поскольку ни одно из определений шаблона в файле CPP не дает сбоя, и (по-видимому) ничего не меняется от CPP к H. Я могу только предположить, что gcc творит какую-то запрещенную магию с -isystem и заставляет заголовок интерпретироваться как файл C, но я понятия не имею, почему, и мне нужно, чтобы это прекратилось. Мне нужен -isystem, так как в реальной жизни код mbed завален предупреждениями, которые мне нужно подавить для этого дерева каталогов.
Этот загадочный комментарий, кажется, именно мой проблема:

Подсказка для будущих читателей: если вы передаете включаемый каталог в gcc через -isystem вместо -I, некоторые версии могут неявно применять C связь. – Ян Шац, 1 июля 2019 г., 15:02

Но нет никаких намеков на то, как это можно решить.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -c-linkage

Вернуться в «C++»