Можно ли использовать предварительно скомпилированный заголовок как часть библиотеки, которая будет статически связана?

Я считаю, что понимаю основы, касающиеся предварительно скомпилированных заголовков, и я не могу придумать ни одной причины, по которой предварительно скомпилированный заголовок нельзя использовать внутри библиотеки of, но мне сказали, что это либо невозможно, либо не следует делать ( не помню какой).

У меня есть проект, в котором общая библиотека будет статически связана с несколькими другими, и я хотел бы использовать предварительно скомпилированные заголовки внутри общей библиотеки для моих внешних зависимостей STL/Boost, но я не уверен, что это возможно. Я ориентируюсь на системы OS X и Windows, и общий поиск деталей, похоже, больше указывает на решения Windows, включающие stdafx.h, что заставляет меня полагать, что использование предварительно скомпилированных заголовков обычно является практикой Windows.

Мой вопрос заключается просто в следующем:

Могу ли я использовать предварительно скомпилированный заголовок внутри библиотеки, которую я буду статически связывать с другими проектами? Если нет, то стоит ли использовать удобный заголовок, скажем, для всех моих зависимостей STL/Boost? Я имею в виду что-то вроде этого:

// common.h
#pragma once

#include <boost/this>
#include <boost/that>
#include <string>
#include <vector>
#include <other_stl_header>

// Foo.h
#include "common.h"

class Foo { ... }

// Foo.cpp

#include "Foo.h"
...

РЕДАКТИРОВАТЬ: я должен указать, что я не ожидаю, что предварительно скомпилированный заголовок будет использоваться совместно с чем-либо, кроме библиотеки, которую я компилирую. Мой вопрос связан с тем, возможно ли создать предварительно скомпилированный заголовок, который используется для компиляции этой библиотеки.


person vmrob    schedule 13.05.2014    source источник
comment
Предварительно скомпилированные заголовки нужны только до компоновки. По сути, это частичный объектный файл, который служит шаблоном для всех единиц перевода, включающих его. Делиться ими нет смысла, потому что это деталь компилятора   -  person sehe    schedule 13.05.2014


Ответы (2)


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

person SomeWittyUsername    schedule 13.05.2014
comment
Ваш ответ подразумевает, что это возможно, и если я найду увеличение скорости в компиляции, то я должен это сделать. Это правильно? - person vmrob; 13.05.2014
comment
Это может ускорить только компиляцию вашей общей библиотеки. Стоит ли оно того - решать вам. Однако из вопроса следует, что вы в основном хотите ускорить компиляцию других проектов, которые статически связаны с вашей библиотекой - для такого использования не будет никаких изменений после того, как вы закончили компиляцию общей библиотеки (которая обычно должна быть делал один раз) - person SomeWittyUsername; 13.05.2014
comment
Я думаю, что я, должно быть, неправильно сформулировал свой вопрос или не знаю, что именно спросить. Меня не волнует увеличение скорости клиентов библиотеки, просто возможно ли использование предварительно скомпилированного заголовка для разделяемой библиотеки. Я считаю, что вы ответили на мой вопрос, хотя. - person vmrob; 13.05.2014
comment
@vmrob все дело в том, что во время привязки PCH не существует. Или, наоборот, во время компиляции разделяемые библиотеки не существуют! Все, что известно компилятору на этом этапе, — это единицы перевода (т. е. исходные файлы и заголовочные файлы). Поэтому, если он у вас предварительно скомпилирован, он содержит только информацию, которая в любом случае будет в заголовках, и не имеет значения, будут ли ваши объекты в конце концов связаны статически или динамически. Однако используйте правильные флаги компиляции при создании PCH. - person sehe; 13.05.2014

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

gcc также использует предварительно скомпилированные заголовки по запросу, но использование этой функции не является общепринятой практикой. gcc генерирует .gch файлов для вывода этапа прекомпиляции.

Простой ответ на ваш вопрос: нет

person Klaus    schedule 13.05.2014
comment
Важное дополнение: даже если два компилятора говорят, что у них есть предварительно скомпилированные заголовки, ничто не говорит о том, что два компилятора будут иметь одинаковый формат. Поэтому, если библиотека использует один компилятор, а пользователь библиотеки использует другой компилятор, они могут быть несовместимы. - person Some programmer dude; 13.05.2014
comment
Также разные версии одного и того же компилятора могут использовать разные форматы. - person Klaus; 13.05.2014
comment
Возможно, это недопонимание с моей стороны, но я ожидал, что предварительно скомпилированная информация заголовка будет скомпилирована в файл библиотеки. Разве это не то, что произошло бы? Я не ожидал, что результаты предварительной компиляции будут доступны кому-либо. - person vmrob; 13.05.2014
comment
@vmrob: Нет, не будет. Результаты предварительной компиляции являются входными данными для последующих шагов компиляции; результаты этих шагов попадают в библиотеку. - person MSalters; 13.05.2014