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

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

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

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

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

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

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

3 голосов
/ 17 марта 2011

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

  • В Solution Explorer в Visual Studio щелкните правой кнопкой мыши узел решения верхнего уровня.
  • Нажмите Диспетчер конфигурации ...
  • Найдите проект статической библиотеки C / C ++ в списке проектов. Щелкните ячейку Configuration для этого проекта. Это превратится в выпадающий список. Выберите Новый .. из этого раскрывающегося списка.
    • Введите имя для новой конфигурации проекта. Называй как хочешь. На этих шагах я назову это Test .
    • Для Копировать настройки из: поля выберите Release , так как вы хотите, чтобы тестовая конфигурация включала оптимизацию.
    • Оставьте флажок Создать новые конфигурации решения включенным.
    • Нажмите OK

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

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

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

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

    • В верхнем левом раскрывающемся списке выберите Release в качестве Активная конфигурация решения :
    • Для вашего проекта Release.exe выберите его Release конфигурацию и убедитесь, что Build отмечен
    • Для вашего проекта Test.exe убедитесь, что Build не отмечен.
    • Для статической библиотеки выберите конфигурацию Release и убедитесь, что Build установлен
  2. Настройте конфигурацию сборки для Test.exe:

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

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

...