Visual Studio 2010 - попытка условно скомпилировать статическую библиотеку на основе целевого .exe

У меня есть статическая библиотека, которая используется в производственном коде и тестовом коде. Я хочу иметь возможность вводить тестовые данные, только если я создаю тестовый .exe. Я хотел бы сделать это, используя препроцессор #define, а не конфигурации MSVS (например, отладка или выпуск), потому что я тестирую производительность. Отладочные сборки отключают оптимизацию, что очень удобно во время отладки, но не очень хорошо, когда я хочу проверить производительность.

В качестве примера предположим, что у меня есть проекты Foo.lib, Production.exe и Test.exe в MSVS. Production.exe и Test.exe ссылаются на Foo.lib. Я хотел бы, чтобы Production.exe и Test.exe перестраивали Foo.lib с соответствующими определениями препроцессора, поэтому код в Foo.lib будет условно компилироваться в зависимости от того, для какого исполняемого файла он предназначен.

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


person Bill    schedule 17.03.2011    source источник


Ответы (2)


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

  • В Обозревателе решений в Visual Studio щелкните правой кнопкой мыши узел решения верхнего уровня.
  • Нажмите Диспетчер конфигурации...
  • Find your C/C++ static library project in the project list. Click the Configuration cell for that project. It will turn into a drop-down. Pick New.. from that drop-down.
    • Enter in a name for a new project configuration. Call it whatever you like. In these steps, I'll call it Test.
    • В поле Копировать настройки из: выберите Выпустить, поскольку вам нужна тестовая конфигурация с включенной оптимизацией.
    • Не снимайте флажок Создать новые конфигурации решения.
    • Нажмите ОК.

Теперь вы можете изменить новую конфигурацию Test вашей статической библиотеки с помощью нужных #define:

  • Найдите свой проект C/C++ в Обозревателе решений. Щелкните его правой кнопкой мыши и выберите Свойства....
  • Выберите новую конфигурацию Test в раскрывающемся списке Configuration в правом верхнем углу.
  • На левой панели выберите Свойства конфигурации | С/С++ | Препроцессор
  • Справа добавьте нужные #define в список Определений препроцессора.

...теперь вы хотите настроить свои сборки так, чтобы у вас была конфигурация сборки, которая собирает Test.exe с конфигурацией Test статической библиотеки и Release.exe с конфигурацией Release библиотеки. конфигурация. Вернитесь в Диспетчер конфигурации (как мы делали это в первых двух шагах выше):

  1. Настройте конфигурацию сборки для Release.exe:

    • In the top-left drop down, select Release as the Active solution configuration:
    • Для проекта Release.exe выберите его конфигурацию Release и убедитесь, что установлен флажок Build.
    • Для проекта Test.exe убедитесь, что флажок Build не установлен.
    • Для статической библиотеки выберите ее конфигурацию Release и убедитесь, что установлен флажок Build.
  2. Настройте конфигурацию сборки для Test.exe:

    • In the top-left drop down, select Test as the Active solution configuration:
    • Для проекта Release.exe убедитесь, что флажок Build не установлен.
    • Для проекта Test.exe выберите его конфигурацию Release (полагаю, это то, что вам нужно) и убедитесь, что установлен флажок Build.
    • Для статической библиотеки выберите ее конфигурацию Test и убедитесь, что установлен флажок Build.

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

person Andrew Brown    schedule 17.03.2011
comment
Спасибо, Эндрю. Ваш ответ отвечает на мой вопрос. Я все еще собираюсь изучить, казалось бы, лучшее решение моей проблемы, опубликованное Гансом. - person Bill; 17.03.2011

Это звучит очень неправильно, тестовые данные не принадлежат .lib. И тестирование кода, созданного не так, как он используется на целевой машине, не является настоящим тестом. VS убережет вас от неприятностей, это просто невозможно. Вы должны использовать другую конфигурацию, чтобы изменить способ сборки .lib.

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

person Hans Passant    schedule 17.03.2011
comment
Спасибо за ответ. Это конкретное приложение использует микрофон для ввода данных. Я постараюсь отключить сбор данных с микрофона. - person Bill; 17.03.2011
comment
Ах, когда я прочитал статическую библиотеку... используемую в тестовом коде, я подумал о выпуске сборки статической библиотеки, но с включенными утверждениями в источниках статической библиотеки. Раньше такая установка была относительно распространена. Отзывы Ганса относительно предпосылки исходных вопросов очень хорошие. - person Andrew Brown; 17.03.2011