2013-05-12 4 views
1

Я пытаюсь создать предварительно скомпилированный файл заголовка для моей общей библиотеки, используя GCC. После создания необходимой конфигурации и пытается построить, я получил эти предупреждения:Предварительно скомпилированный файл заголовка для проекта общей библиотеки с использованием GCC

cc1plus: warning: ./PrecompiledHeaders.h.gch/.c++: created and used with different settings of -fpic [enabled by default] 

Через некоторое время поисков, я нашел этот кусок кода, который, кажется, предположить, что PCH не работает с общим кодом:

/* -fpic and -fpie also usually make a PCH invalid. */ 
if (data[0] != flag_pic) 
    return _("created and used with different settings of -fpic"); 
if (data[1] != flag_pie) 
    return _("created and used with different settings of -fpie"); 
data += 2; 

Итак, я поменял свою библиотеку на статическую библиотеку, и ошибка исчезла, а время компиляции было сокращено! Так действительно ли возможно иметь PCH с разделяемой библиотекой? Если да, есть ли какая-нибудь работа вокруг этого?

ответ

3

Сообщение и код, который вы опубликовали, не предполагают, что PCH не может использоваться совместно с общим кодом. Он сообщает вам, что вы не можете использовать файл PCH, скомпилированный с -fpic при компиляции кода без -fpic и наоборот. То же самое для -fpie.

В зависимости от архитектуры -shared может подразумевать -fpic или другие подобные варианты.

Вам необходимо предварительно скомпилировать заголовки с теми же параметрами, что и для компиляции остальной части вашего кода. Если вы хотите использовать PCH для статических и динамических сборок, вам понадобится (по крайней мере) два разных набора предварительно скомпилированных заголовков.

+0

Спасибо за комментарий. Пожалуйста, см. Ответ, который я только что добавил, и дайте мне знать, если у вас есть какие-либо комментарии по этому поводу. – Rafid

+0

'-fPIC' является единственным вариантом для x86_64 для общих объектов. Я не слишком разбираюсь в сложных деталях, но вы найдете больше информации и ссылок здесь: http://stackoverflow.com/questions/3961446/why-does-gcc-not-implicitly-supply-the-fpic- flag-when-compiling-static-librarie - вот почему я сказал «использовать одни и те же параметры», а не точно указать, какой флаг вы должны добавить - точные параметры зависят от вашей архитектуры. – Mat

1

Ответ Матта правильный, но он не исправил мою проблему, потому что я уже пытался добавить -fpic при компиляции файла PCH, и это не сработало. Оказалось, что мне нужен флаг -fPIC вместо -fpic. Я точно не знаю, почему, но возможно потому, что мой файл PCH слишком велик. GCC кавычки страницы руководства:

-fPIC: Если поддерживается для целевой машины, испускают позиционно-независимый код, подходящий для динамической компоновки и во избежание каких-либо ограничений на размер глобальной таблицы смещения. Этот параметр имеет значение для m68k, PowerPC и SPARC.

Что меня смущает, поскольку последнее утверждение, в котором говорится об этом, имеет значение только для m68k, PowerPC и SPARC, но моя машина - Intel i7 (3-е поколение)!