Короткая версия: Есть ли способ в C (и C ++, скомпилированный с GCC 6.4) неоднократно объявлять глобальную переменную в единице перевода?
Длинная версия: с какой стати я хотел бы сделать это?Ну что ж:
Я пытаюсь собрать CouchDB на Alpine Linux на ARMv6.Для этой платформы не существует готового пакета CouchDB (AFAICT).
CouchDB зависит от SpiderMonkey / mozjs (движок JavaScript Mozilla).Для этой платформы AFAICT не существует готовых пакетов mozjs (обратите внимание, что это готовых пакетов mozjs для Alpine на всех не-ARM платформах).
SpiderMonkey включает множество системобертки, например, эта версия features.h
:
#pragma GCC system_header
#pragma GCC visibility push(default)
#include_next <features.h>
#pragma GCC visibility pop
На платформе установлено FORTIFY_SOURCE
.Поэтому, когда стандартная библиотека C ++ #include
s stdlib.h
, она получает /usr/lib/fortify/stdlib.h
, что делает это:
__extension__
#include_next <limits.h>
Первое, что limits.h
делает, это:
#include <features.h>
После предварительной обработки это заканчивается:
__extension__
#pragma GCC system_header
#pragma GCC visibility push(default)
... contents of system features.h ...
#pragma GCC visibility pop
GCC whingings, потому что после __extension__
должно следовать выражение, на которое влияет __extension__
;он жалуется, что #pragma GCC visibility push(default)
не достаточно хорош.
Очевидная вещь, которую нужно сделать, это исправить версию SpiderMonkey features.h
, чтобы поместить фиктивную декларацию вверху файла, чтобы GCC был доволен __extension__
декларация.Но, конечно, файл включен несколько раз, поэтому я должен повторить его.
Код компилируется с -std=gnu99 -fno-rtti -fno-exceptions -fno-math-errno -pthread -pipe -g -freorder-blocks -O3 -fomit-frame-pointer
Есть идеи?