Разделить проект Visual Studio C ++: как это сделать (почти) автоматически?

У меня есть проект Visual Studio 2015 C ++, в котором есть ссылки на несколько сторонних бесплатных библиотек.

Чтобы сократить время компиляции (в настоящее время 5–90 секунд),
я хочу разбить проект на множество более мелких проектов.

В процессе подготовки я уже создал фильтры в обозревателе решений.
Фильтры показывают структуру верхнего уровня моего проекта, разделенную на уровни : -

Tier 1  - my core library, no reference to outside, rarely change
Tier 2a - my custom encapsulator for external library "A"
Tier 2b - my custom encapsulator for external library "B"
...
    note: all Tier2 #include Tier1 , rarely change
Tier 3  - business logic that rarely change, #include Tier1&2
Tier 4  - business logic that often change , #include Tier1&2&3

Вопрос: как легко разделить этот проект на несколько?
например почти легко, просто нажмите на фильтр и выберите «извлечено в новый проект»

Я прочитал несколько источников - их объяснение подходит для создания с нуля, а не для существующего проекта.

Также кажется, что мне нужно добавить несколько строк для некоторых отдельных файлов.

#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

У меня> 100 файлов, так что это не очень практично.
Я поискал в Google "разделить проект Visual Studio c ++", но не нашел много результатов.

Связанный вопрос: не объяснять "как"
Как разделить решение Visual Studio?

Внешняя ссылка: во всех есть строка #define DECLDIR __declspec (dllexport)
http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855/DLL-Tutorial-For-Beginners.htm
https://manski.net/2011/11/creating-a-dll-project/


person javaLover    schedule 23.06.2016    source источник
comment
Я знаю, что нет простого способа. Обычно я делаю копию всей папки проекта, переименовываю файл vcxproj, переименовываю все ссылки на имя проекта в файле vcxproj (используя notepad ++), затем добавляю новый проект в решение и удаляю все файлы, которые мне не нужны. там. Занимает около 3 минут, как только вы к этому привыкнете ... Не идеально, но все же ...   -  person Baldrick    schedule 23.06.2016
comment
@Baldrick Спасибо! 3 минуты в лучшем случае очень мало! .... Не могли бы вы объяснить, пожалуйста, переименуйте все ссылки на имя проекта в файле vcxproj? Если у меня есть pj1.vcxproj и я хочу создать библиотеку pj2, грубо говоря, мне придется отредактировать все слова pj1 в pj1.vcxproj, верно? Я нашел только 1 место ‹RootNamespace› pj1 ‹/RootNamespace›, вы это имеете в виду? ...... Мне все еще нужно DECLDIR declspec (dllexport) каждый файл вручную?   -  person javaLover    schedule 23.06.2016
comment
Да, в основном. Количество ссылок на самом деле зависит от того, что находится в проекте, но переименуйте все найденные и попробуйте добавить их обратно в решение. Он не загрузится, если вы его напортачили. Это не поможет с частью DECLDIR - для этого вам, вероятно, понадобится какой-то макрос или скрипт для обработки ваших файлов и добавления их.   -  person Baldrick    schedule 23.06.2016


Ответы (1)


Прежде всего я хотел бы отметить, что если ваши нижние уровни меняются редко, то и полная компиляция тоже будет редко выполняться. Также обратите внимание, что нет одного щелчка мышки, чтобы управлять всеми решениями.

Ты почти там. Если вы уже сгруппировали свой проект в отдельную библиотеку, следующим шагом будет преобразование их в динамическую библиотеку. Это могло бы значительно ускорить компиляцию, если бы символы не менялись (модификация реализации в порядке). Например, для проекта Tier 1:

Сначала создайте проект динамической библиотеки (проект DLL). Удалите весь исходный код, созданный VS. Сгруппируйте весь исходный код Tier 1 (заголовок и файл cpp / реализации) в каталог проекта. Добавьте их в проект.

У нас может быть несколько динамических библиотек для каждого файла заголовка, но Visual Studio не лучшая IDE для такой задачи (используйте такие технологии, как CMake или QBS). На всякий случай объедините объявления в один файл заголовка (или, по крайней мере, в какое-то управляемое число, не забудьте изменить #include в файлах реализации). Добавьте в заголовок макрос динамической библиотеки, например tier1lib.h

#ifdef DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

Этот макрос будет определять, импортируем мы или экспортируем символ, на основе наших команд сборки.

Теперь в tier1lib.h отметьте, какой символ будет видимым для другого проекта. В каждой функции добавьте макрос DECLDIR, например

DECLDIR void foo();
// or, if you want to export/import whole class' public symbols
class DECLDIR Foo{};

Построить это.

Теперь в основном проекте расскажите VS о том, где найти динамическую библиотеку. Добавьте путь включения (где найти заголовки), путь к библиотеке (где найти файл *.lib) и имя файла библиотеки (например, tier1lib.lib). Скопируйте полученный *.dll в папку вывода основного проекта, и компиляция Tier 1 теперь полностью отделена от основного проекта.

person Leben Asa    schedule 23.06.2016
comment
Благодарить. На уровне 1 30 файлов .h, не следует ли объединять все объявления в один файл заголовка? IMHO, просто предварительное объявление 30 файлов может быть утомительным и снижает ремонтопригодность. .... или это правильный путь в реальном деловом мире? - person javaLover; 23.06.2016
comment
Неа. Просто делайте то, что вам нужно. Объединение деклараций просто означает менее динамический библиотечный макрос, ни на что не влияет. - person Leben Asa; 23.06.2016
comment
Я хотел бы предложить потратить ваше время на инструменты сборки со сценариями, такие как CMake или QBS, у них есть способы оптимизировать сборку. По моему опыту (создание OpenCV), даже использование MSBuild значительно быстрее, чем создание в VS. Вы можете ясно видеть, что VS часто создает что-то более одного раза на панели вывода, я понятия не имею, почему он это делает. - person Leben Asa; 23.06.2016
comment
CMake ничего не построит. На самом деле это генератор, поэтому вы получите решение VS. Но с его помощью вы можете легко создать интересный проект с несколькими зависимостями. Qbs с другой стороны, может найти большинство компиляторов в вашей системе и фактически построить ваш проект. - person Leben Asa; 23.06.2016