Ответ 1
Вы немного смущены тем, как Visual Studio работает с файлами на С++, но это нормально, поскольку документация отвратительна. Прежде всего: в отличие от С# или Java, расположение файлов в проекте не имеет отношения к расположению файлов на вашем диске. На самом деле файлы и папки не "находятся в" проекте; в проекте перечислены имена и пути файлов и папок, которые уже существуют на вашем диске.
В общем, вы создаете макет папок с исходными файлами внутри этих папок. Вы делаете это за пределами Visual Studio. Вы также создаете файл проекта. Когда вы добавляете файл в проект, все, что вы делаете, сообщает проекту, где найти файл на диске.
Позвольте работать с конкретным примером, и я покажу вам, как я его организую. Предположим, вы делаете программу калькулятора графиков, называемую SuperCalc. У вас будет папка "Источник", а затем создайте папки внутри источника для хранения разных файлов. Предположим, что созданные вами папки:
-
SuperCalc\Source\Input
-
SuperCalc\Source\Math
-
SuperCalc\Source\Math\Matrix
-
SuperCalc\Source\Output
У вас есть 3 подкаталога Source
: Input
, Output
и Math
. Подкаталог Math
имеет подкаталог под названием Matrix
. У вас будут файлы .cpp в Input, Math, Matrix и Output. Вы создадите эти каталоги (папки) с помощью проводника Windows или командной строки.
Теперь вы также захотите создать файл решения (SuperCalc.sln
) и файл проекта (SuperCalc.vcxproj
и SuperCalc.vcxproj.filters
). Сделайте это внутри Visual Studio. Обычно файл проекта находится в подпапке каталога решений; это будет сделано автоматически для вас Visual Studio. Выберите место для
файл решения - он должен быть где-то в той же структуре каталогов (дерево папок) в качестве исходного кода. Я бы предложил разместить его рядом с исходным каталогом в:
-
SuperCalc\Build
Перейдите в VS и выберите File > New > Project > Visual Studio Solutions > Blank Solution File
. Дайте решению имя (возможно, "SuperCalc" ) и местоположение (место, которое мы только что выбрали в каталоге SuperCalc\Build
). Он создаст файл решения для вас.
Теперь щелкните правой кнопкой мыши по решению в обозревателе решений ( "Решение SuperCalc, 0 проектов" ) и выберите Add > New Project
. Выберите имя - это будет ваше исполняемое приложение, например "SuperCalc" ! Выберите Win32, либо Консольное приложение Win32 (это программа DOS-консоли), либо Проект Win32 (это обычная программа для Windows GUI). Обычно я затем нажимаю "Настройки приложения", чтобы внести некоторые важные изменения: во-первых, я выбираю Empty Project, потому что я не хочу, чтобы Visual Studio создавала файлы и код для меня, если я не скажу. Когда все настроено так, как я хочу, я нажимаю FINISH.
Теперь у вас есть файл решения и проект, созданный Visual Studio. У вас также есть исходный код или, по крайней мере, структура каталогов (дерево папок), где будет создан ваш исходный код, созданный вне Visual Studio. Это время, чтобы соединить две вещи вместе.
Если вы хотите, вы можете перечислить все исходные файлы в фильтр исходных файлов вашего проекта. Несмотря на то, что они будут поступать из разных каталогов (Input, Matrix и т.д.), Нет никакой необходимой связи между местоположениями файлов на диске и их внешним видом в проекте. Но если у вас много файлов, проще создать "подфильтры", фильтры внутри фильтра "Исходные файлы" и дать им имена подпапок Source. Таким образом, вы копируете структуру своих дисковых каталогов внутри вашего файла проекта.
Щелкните правой кнопкой мыши по фильтру исходных файлов проекта "SuperCalc" и выберите "Добавить" > "Добавить новый фильтр". Дайте ему имя Input
(первый из каталогов SuperCalc\Source). Также создайте фильтры Math
и Output
. Щелкните правой кнопкой мыши по фильтру Math
и выберите "Добавить" > "Добавить новый фильтр", чтобы создать подфильтр с именем Matrix
(внутри Math). Теперь у вас есть следующие фильтры:
SuperCalc Source Files Input Math Matrix Output
который параллелен каталогам (папкам), которые вы создали ранее. Это просто удобная организация для людей. Visual Studio ничего не понимает. Если вы просто скажете VS "добавить файл", он не поместит файл в правильный фильтр. Вы должны будете сказать, куда его поместить.
Чтобы добавить или создать ваши .cpp файлы, выберите имя фильтра, соответствующее каталогу, в котором находится файл .cpp. Итак, чтобы добавить или создать файл SuperCalc\Source\Math\Matrix\matrix_multiply.cpp
, щелкните правой кнопкой мыши по фильтру Matrix
в Обозревателе решений и выберите "Добавить" > "Добавить новый файл" или "Добавить существующий файл". (Добавить существующий файл для тех случаев, когда вы уже записали файл matrix_multiply.cpp, и просто хотите указать проект, где он находится.) Используйте диалоговое окно для перехода в каталог Source\Math\Matrix
. Повторите этот процесс для всех исходных файлов в вашей программе.
У вас также возник вопрос: "Есть ли что-то похожее на $(CURDIR), которое я мог бы использовать для включения папки исходного файла без абсолютного пути?" Вам повезло: проекты Visual Studio не используют абсолютные пути! Они используют относительные пути. В файле проекта хранится относительный путь, необходимый для получения из каталога, содержащего файл .vcxproj, в каталог, содержащий исходный файл. Поэтому, если вы создали SuperCalc.sln
и SuperCalc.vcxproj
, где я предложил (каталог SuperCalc\Build
), и вы добавляете свои .cpp файлы в исходные подкаталоги, вы можете заглянуть внутрь файла SuperCalc.vcxproj с помощью Notepad, Будем видеть строки вроде:
<ClCompile Include="..\..\..\Source\Math\Matrix\matrix_multiply.cpp" />
Поскольку нет абсолютных путей, вы можете взять все дерево каталогов SuperCalc и перенести их в другое место, и все это будет работать. Нет необходимости в переменных переменных среды, таких как $(CURDIR).
Последнее замечание: поскольку вы размещаете исходные файлы в нескольких каталогах, у вас могут быть проблемы с заголовками #include
, файлами .h или .hpp. Вы должны сообщить компилятору директории, в которых расположены ваши файлы заголовков. Вероятно, они будут разбросаны по нескольким каталогам. Поэтому отредактируйте настройки проекта: щелкните правой кнопкой мыши по имени проекта в обозревателе решений, выберите "Свойства" и разверните "Свойства конфигурации" > "C/С++ > Общие". Первое поле в листе свойств говорит "Дополнительные каталоги включения". Прежде чем делать что-либо еще, щелкните раскрывающееся меню Конфигурация и выберите Все конфигурации. Если у вас есть 32-битная и 64-битная сборка, щелкните раскрывающееся меню Платформа и выберите Все платформы. Теперь перейдите в "Дополнительные каталоги Include" и добавьте все пути во все исходные каталоги, указав пути, указанные относительно каталога файла проекта. Поэтому для примера SuperCalc это будет выглядеть так:
..\..\..\Source\Input;..\..\..\Source\Math;..\..\..\Source\Math\Matrix;..\..\..\Source\Output
После этого изменения файл, например Source\Math\Matrix\matrix_multiply.cpp, может иметь Линия
#include "input_configuration.hpp"
чтобы # включить файл из каталога ввода, и он будет все просто работать.
(Если это не все Just Work, обычный подход заключается в возврате в Project Properties и скрипте с количеством ..\
последовательностей перед вашими дополнительными каталогами Include. Помните, что каждый раз, когда вы идете сделать измените, вы должны снова выбрать Все конфигурации - в противном случае ваши изменения будут применяться только к текущей конфигурации (отладка или выпуск). Этот параметр не является липким.)