Общий pch
От: x-code  
Дата: 06.05.15 14:40
Оценка:
Хочу сделать общий на много проектов pch файл (так как, как оказалось, для каждого проекта он генерируется отдельно, а содержимое одинаковое). В pch будут подключаться только стандартные библиотеки вроде stl, boost и т.д.
Сделал специальный проект, состоящий только из stdafx.h / cpp, прописал там инклуды stl/boost — все хорошо, pch генерируется. А вот при попытке подключить этот pch к другому проекту при компиляции этого проекта вылезает такое:
vc100.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header.
vc100.idb is not the idb file that was used when this precompiled header was created, recreate the precompiled header.

то есть получается, что файл pdb КАЖДОГО ПРОЕКТА должен зачем-то соответствовать файлу pch (который не содержит НИЧЕГО из этого проекта — там только stl и boost!). Я не врубаюсь в такое вообще
В общем, на stackoverflow советуют что-то куда-то копировать, но я так и не понял что и куда:
http://stackoverflow.com/questions/645747/sharing-precompiled-headers-between-projects-in-visual-studio
https://social.msdn.microsoft.com/Forums/vstudio/en-US/665d4183-f85c-481d-bada-03283b310099/shared-precompiled-header?forum=vclanguage

Что делать? Visual Studio 2010, затем хочу сделать то-же самое для gcc, но еще не пробовал.
Re: Общий pch
От: __kot2  
Дата: 06.05.15 14:51
Оценка:
Здравствуйте, x-code, Вы писали:
XC>Сделал специальный проект, состоящий только из stdafx.h / cpp, прописал там инклуды stl/boost — все хорошо, pch генерируется. А вот при попытке подключить этот pch к другому проекту при компиляции этого проекта вылезает такое:
есть три опция подключения pch
— create pch file
— use pch file
— automatic

догадка моя, что вы используете последнее. оно и само по себе то подглючивает, а в таком случае тем более работать не будет. попробуйте use pch file
Re[2]: Общий pch
От: x-code  
Дата: 06.05.15 14:55
Оценка:
Здравствуйте, __kot2, Вы писали:

__>есть три опция подключения pch

__>- create pch file
__>- use pch file
__>- automatic

__>догадка моя, что вы используете последнее. оно и само по себе то подглючивает, а в таком случае тем более работать не будет. попробуйте use pch file


Опции "automatic" нет, есть "not use". А использую я именно use.
Re: Общий pch
От: landerhigh Пират  
Дата: 06.05.15 15:06
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Что делать? Visual Studio 2010, затем хочу сделать то-же самое для gcc, но еще не пробовал.


В общем случае каменный цветок не выйдет. Сам пытался сделать такое
www.blinnov.com
Re[2]: Общий pch
От: x-code  
Дата: 06.05.15 15:12
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>В общем случае каменный цветок не выйдет. Сам пытался сделать такое


А подробнее можете рассказать?
И если для msvc не выйдет, может хотя-бы для gcc стоит это сделать? Или там тоже никак?
Re: Общий pch
От: uzhas Ниоткуда  
Дата: 06.05.15 15:14
Оценка: +4
Здравствуйте, x-code, Вы писали:

XC>Что делать?


ну вы же сами дали ссылки, там есть советы

The problems described in the link above are real, so we had to find workarounds since suggestion #98646 was postponed:

— Parallel building results in read-locks of the shared pch file.

Our clients have to disable parallel building

— Error with debug builds: error C2859: (...)\vc90.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header.

For this one we had to find a trick : the "Program Database file Name" C++ option of our projects are set to the file name of our precompiled header project ($(IntDir)\mypchprojetname). As a pre-build-step, we copy the .pdb and .idb file from our pch project folder output to the current project folder output:

xcopy /D /Y "$(SolutionDir)\mypchprojetname\$(IntDir)\mypchprojetname.pdb" ".\$(IntDir)".

xcopy /D /Y "$(SolutionDir)\mypchprojetname\$(IntDir)\mypchprojetname.idb" ".\$(IntDir)".

The reason we do this is because the Program Database File is modified during the build process to include debug info for the compiled files and then can not be shared between projects.

Notice the /D option that will only copy the file when it's newer. If you don't set this option, the project pdb file will be replaced by the one from the pch project when you just link your project, and the debug info from your project sources will be crashed, resulting in the following warning for every source files: myfile.obj : warning LNK4204: '(...)\mypchprojetname.pdb' is missing debugging information for referencing module; linking object as if no debug info.


хотя все это криво, все же pch привязаны по задумке к проекту (то есть у каждого проекта свой pch, потому что свойства проекта типа дефайнов могут быть разные).
вы идете скользкой дорожкой
Re[3]: Общий pch
От: landerhigh Пират  
Дата: 06.05.15 15:18
Оценка:
Здравствуйте, x-code, Вы писали:

XC>И если для msvc не выйдет, может хотя-бы для gcc стоит это сделать? Или там тоже никак?


В сулчае с msvc в лучшем случае может однажды показаться, что все работает. А потом — бабах. В общем, так делать не советуют.
Про gcc врать не буду, сам не пробовал.
www.blinnov.com
Re: Общий pch
От: Pavel Dvorkin Россия  
Дата: 06.05.15 16:46
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>Хочу сделать общий на много проектов pch файл (так как, как оказалось, для каждого проекта он генерируется отдельно, а содержимое одинаковое). В pch будут подключаться только стандартные библиотеки вроде stl, boost и т.д.


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

И для чего ?

Скорость увеличить ? Так pch файлы не часто изменяются.

Память на диске сэкономить ?
With best regards
Pavel Dvorkin
Re: Общий pch
От: sokel Россия  
Дата: 07.05.15 21:23
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Хочу сделать общий на много проектов pch файл (так как, как оказалось, для каждого проекта он генерируется отдельно, а содержимое одинаковое). В pch будут подключаться только стандартные библиотеки вроде stl, boost и т.д.


Немного не о том, но в контексте увеличения скорости сборки тоже может быть интересно...
Решил недавно по быстрому прикрутить precompiled заголовки (не использовались). Чтобы не затрагивать файлы проекта добавил precomipled.h через /FI.
/Yc опция не дружит с /MD, а многопоточная сборка всё таки рулит. Поэтому для проекта ставим /Yu, плюс добавляем пустышку precompiled.cpp с опцией /Yc.
Ну и вроде всё, сначала компилируется pch, а потом уже с /MD всё остальное.

Для gcc всё то же самое, даже проще — добавляем .gch target, натравливаем компилятор непосредственно на precompiled.h, ставим в зависимость от него всё остальное.
Аналогично /FI подключаем precompiled.h через -include. Через зависимость сначала компилируется precompiled.h -> precompiled.gch, а потом уж все его используют.
C gcc получается можно и один gch на несколько проектов сделать.

Ещё можно поиграться со сборкой без использования диска. Поставить, например, ImDisk. Прописать пути сборки относительно переменной окружения, а студию запускать через батник с установкой этой переменной в путь к папке на RAM диске. Чтоб совсем-совсем без диска в этом же батнике переопределить TEMP/TMP, там компилятор всякие временные файлики создаёт. Правда, если SSD используется, выигрыша практически нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.