Недавно мне было поручено реструктурировать приложение, и я столкнулся с довольно странной проблемой. Я как можно лучше свел проблему к образцу кода. Рассмотрим следующее:
offender.h
__attribute__ ((visibility ("default")))
typedef struct A {
int a;
} A;
test. cpp:
#include <iostream>
#include <offender.h>
int main(void)
{
A a;
a.a = 10;
std::cout << a.a << "\n";
return 0;
}
Если я бегу:
g++ -Wall -Werror -o test -I. test.cpp
In file included from test.cpp:3:
./offender.h:4:3: error: ‘visibility’ attribute ignored [-Werror=attributes]
4 | } A;
| ^
cc1plus: all warnings being treated as errors
make: *** [Makefile:3: all] Error 1
Однако это имеет смысл, если я перемещу offender.h в системный путь и скомпилирую без -I. Я получаю следующее:
sudo mv offender.h /usr/local/include/
g++ -Wall -Werror -o test test.cpp
Предупреждение не срабатывает.
Как возможно, что предупреждение возникает, если я включаю файл заголовка из текущего каталога, но работает нормально, если я включаю его из предопределенный каталог include? Что мне не хватает?
Это было протестировано с g ++ 7.5.0 (Ubuntu 18.04) и 9.3.0 (Ubuntu 20.04), оба генерируют один и тот же результат.
Edit: прояснил проблему