Совместное использование промежуточных файлов между проектами C ++?

В настоящее время я пытаюсь выяснить, возможно ли для двух разных нативных проектов Visual-C ++ (с одинаковыми настройками компилятора) делиться своими промежуточными файлами (obj, pch, ...)

Пример должен помочь:

Это нормальная установка:

PROJECTS \ P1 \ p1.vcproj; p1.cpp; ...
              \ Release_Intermediate_Dir \ p1.obj
                                         \ tool1.obj
         \ P2 \ p2.vcproj; p2.cpp; ...
              \ Release_Intermediate_Dir \ p2.obj
                                         \ tool1.obj
         \ COMMON \ tool1.cpp; ...

Что насчет этой настройки:

PROJECTS \ P1 \ p1.vcproj (uses: p1.cpp; p1_main.cpp)
              \ p1_test.vcproj (uses: p1.cpp; p1_test.cpp)
              \ Release_Intermediate_Dir \ p1.obj      (used by both projects p1 and test)
                                         \ tool1.obj
                                         \ p1_main.obj (only p1.vcproj)
                                         \ p1_test.obj (only p1_test.vcproj
         \ COMMON \ tool1.cpp; ...

Могу ли я использовать одну и ту же промежуточную папку для двух проектов C ++, тем самым напрямую разделяя obj файлы?

Или мне всегда будет нужен дополнительный статический проект библиотеки? (Насколько я понимаю, статическая библиотека - это просто контейнер для obj файлов.)


Зачем мне это нужно? Посмотрите это сообщение в блоге: Написание модульных тестов в Visual Studio для Native C ++.

Он использует статическую библиотеку с единственной целью - иметь два разных исполняемых файла (основные функции, если хотите). (Забудьте об управляемом / CLI.) Это означает, что в вашем решении есть 3 проекта (необходимо поддерживать три проекта), когда вам действительно нужны только два проекта, которые используют один и тот же код с одинаковыми настройками компиляции, но используют разные main / startup такелаж.


person Martin Ba    schedule 28.09.2011    source источник


Ответы (1)


Установив одинаковые флаги компиляции для обоих проектов и сделав промежуточные компоненты проекта A предпосылками проекта B, вы удаляете все степени свободы из B. Нет никакой мыслимой возможности скомпилировать B в одиночку, и ваша ссылка предполагает, что B не имеет смысла d ' etre, кроме тестирования A. Самым простым и чистым решением было бы объединить тесты из B в A и сделать все это одним проектом (что, честно говоря, и есть).

На языке автомата вы бы объявили модульные тесты в B как check_PROGRAMS, и они были бы скомпилированы только для проверки вашей программы. Я не эксперт по Visual-C ++, но это чистое решение, которое каким-то образом должно работать с VC ++.

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

noinst_LTLIBRARIES = libthings-to-test.la libthings-not-tested.la
bin_PROGRAMS = production
check_PROGRAMS = unit_test_a

production_SOURCES = main.cpp
production_LDADD = libthings-to-test.la libthings-not-tested.la
unit_test_a_SOURCES = test.cpp
unit_test_a_LDADD = libthings-to-test.la
libthings_to_test_la_SOURCES = foo.cpp bar.cpp baz.cpp

со всей кодовой базой (производственный код, общие библиотеки, тесты) в одном проекте, то есть в одном модуле, который настроен и распространяется полностью и имеет один номер версии. При установке конечным пользователем / дистрибьютором одна программа production.exe будет связана. При компиляции с make all вспомогательные библиотеки и необходимые объекты будут скомпилированы в каталоге сборки, а при вызове make check компилируются объекты, необходимые только для модульных тестов, производственный код связывается и тесты запускаются. Опять же, извините, я не могу перевести это на Microsoft Speak.

person thiton    schedule 28.09.2011
comment
На самом деле это скорее симметричные отношения ИМХО. Оба проекта имеют общий код. (Те же артефакты компиляции.) Но компоновщик свяжет что-то свое для каждого из них. Я не знаком с automake: не могли бы вы добавить ссылку на функцию, о которой говорите? - person Martin Ba; 28.09.2011
comment
Я бы с удовольствием, но боюсь, что руководство по автопроизводителю не так уж и конкретно. Я добавил пример того, как это можно решить в automake. - person thiton; 28.09.2011