VC2010 С++ - организация исходных файлов

У меня возникли вопросы о том, как организовать исходные файлы в проекте VC 2010 С++. Фильтры по умолчанию, которые включены, не будут достаточными, так как, в конечном счете, у меня будет много файлов .cpp и .hpp, чтобы они не были беспорядочными. Я хотел бы создать папку в корне проекта под названием "источник", а затем создать папки внутри "источника" для различных категорий исходных файлов, которые я хотел бы использовать. Когда я нажимаю правой кнопкой мыши на решении, я получаю возможность добавлять фильтр, а не папку. Я могу создавать папки вручную в проводнике Windows, а затем включать их, но затем я теряю возможность добавлять фильтры. Есть ли способ добавить новые папки (без использования Windows Explorer) и использовать фильтры?

Кроме того, есть ли что-то похожее на $(CURDIR), которое я мог бы использовать для включения папки исходного файла без абсолютного пути?

Заранее спасибо за помощь

Ответ 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. Помните, что каждый раз, когда вы идете сделать измените, вы должны снова выбрать Все конфигурации - в противном случае ваши изменения будут применяться только к текущей конфигурации (отладка или выпуск). Этот параметр не является липким.)

Ответ 2

На самом деле можно просмотреть (и манипулировать) физическую структуру файла через Visual Studio, как описано в этом сообщении SO:

Файл заголовка/источника не является требованием, предъявляемым Visual Studio. Это просто макет по умолчанию, и он виртуальный, а не физический. если ты нажмите "Показать все файлы" в проводнике решений, он покажет дерево папок, как на жестком диске, - которое вы можете манипулировать как вы считаете нужным.

Ответ 3

Использование системы сборки, такой как CMake или Premake может помочь при организации файлов, и у него есть дополнительное преимущество, помогая вам переносить свой код на другие платформы. Здесь - хорошая презентация по этому вопросу.

Как бы это ни было полезно, я также должен добавить, что наличие исходных файлов отдельно от вашего файла проекта (*.vcxproj) затрудняет создание новых файлов, поскольку Visual Studio по умолчанию хочет создавать новые файлы в той же папке, что и ваш проект. Обходной путь к этой проблеме, который я нашел до сих пор, заключается в использовании расширения Visual Assists, поскольку он позволяет добавлять новые файлы относительно каталога или вашего открытого файла. Подробнее см. .

Ответ 4

Я опаздываю, но я рекомендую принятый ответ. Основная причина, если для переносимости. Вместо этого я рекомендую:

  • Чтобы создать макет папок и вложенных папок вне визуальной студии (то же, что и принятый ответ, но следующие точки разные). Внутри каждой подпапки создайте папку include и src
  • Затем в свойствах конфигурации > C/С++ > Общие > "Дополнительные каталоги Include" (для конфигурации All и Plateforms) добавьте папку single, которая является основой всей вашей подпапки.
  • Чтобы добавить файлы src и включить файлы в эти подпапки.

  • Наконец, включите каждый заголовочный файл, используя пути родственники в эту базовую папку.

Чтобы быть ясным: если макет вашего проекта выглядит следующим образом:

MyProjet
   Math
     include
       random.h
       functions.h
     src
       random.cpp
       functions.cpp
   Probability
      include
        normal.h
      src
        normal.cpp

вы должны иметь в functions.cpp следующий оператор include:

#include"Math/include/functions.h"

если вам также нужно использовать код normal в functions.cpp, то верхняя часть functions.cpp должна выглядеть так:

#include"Math/include/functions.h"
#include"Probability/include/normal.h"

При этом вы сможете повторно использовать свою подпапку Math в другом проекте (B) без боли: просто добавив базовую папку MyProject в "Дополнительные каталоги Include" проекта B.

Ключевым моментом является наличие только одной базовой папки в поле "Дополнительно" Включить каталоги ".

ps: функция intellisense VS 2015 помогает много писать #include...

Ответ 5

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

Project > Properties > Configuration Properties > Debugging > Working Directory