Можете ли вы сделать VC ++ Solution установленным препроцессором #defines для загруженных проектов? - PullRequest
5 голосов
/ 11 марта 2011

У меня есть библиотека, которая поддерживает #define для управления его сборкой.Однако библиотека может использоваться несколькими проектами EXE, которые хотят иметь разные версии.Можно ли заставить проект app / EXE установить #define, который будет использоваться библиотекой при сборке, или установить его в решении?

Единственный другой вариант, о котором я могу подумать, - это создать отдельную конфигурацию сборки напроект библиотеки, но это быстро вышло бы из-под контроля.Это характерно, например, для сборок Unicode / Non-Unicode, но в итоге вы умножите количество конфигураций для каждой комбинации.

Ответы [ 2 ]

5 голосов
/ 11 марта 2011

В следующем подходе предполагается, что каждое .EXE / приложение (которое использует эту библиотеку) имеет свое собственное решение Visual Studio.

У вас есть контроль над библиотекой, верно?Шаги 1-3 внесут изменения в свой файл проекта, а шаг 4 добавляет файл к исходному коду библиотеки.

  1. Установить свойства проекта> C / C ++> Дополнительно> Принудительное включение в mylibrary_solution_defines.h.

  2. Редактировать свойства проекта> C / C ++> Общие> Дополнительно Включить каталоги, чтобы поставить $(SolutionDir); в начале списка каталогов.

  3. Установите для обоих свойств проекта> Общие> Выходной каталог и Промежуточный каталог что-то относительно каталога решения.Возможно $(SolutionDir)$(ProjectName)\$(Configuration)?Вы хотите убедиться, что библиотека перестраивается для каждого решения, которое ее использует;не должно быть общего доступа к файлам .lib или .obj.

  4. Создайте пустой, фиктивный заголовочный файл с именем mylibrary_solution_defines.h и поместите его в исходный код своей библиотеки, чтобы #include "mylibrary_solution_defines.h" никогда не потерпит неудачу.

  5. В каждом решении для приложения / EXE - при условии, что у вас есть разные решения для каждого приложения, использующего эту библиотеку, в противном случае весь этот план потерпит неудачу - создайте mylibrary_solution_defines.h файл с вашими #defines.

Вы видите, что происходит?Каждый исходный файл библиотеки неявно #include s "mylibrary_solution_defines.h", и он преимущественно получает этот файл из каталога решения.Так что этот файл может быть разным для каждого решения.Так что если вашему решению ConsoleModeInterfaceProgram.sln нужна библиотека, построенная с #define TEXTONLY 1, поместите эту строку в mylibrary_solution_defines.h, которая находится в том же каталоге, что и ConsoleModeInterfaceProgram.sln.

0 голосов
/ 11 марта 2011

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

Единственный выход - добавить исходный код «библиотеки» непосредственно в соответствующие проекты приложения и установить правильные настройки препроцессора для каждого проекта - таким образом, вывсе еще имеют преимущество общей базы кода.

...