visual-studio - tutorial - visual studio code proxy
VC2010 C++: organización de los archivos fuente (5)
Tenía algunas preguntas sobre cómo organizar los archivos fuente en un proyecto C ++ de VC 2010. Los filtros predeterminados que se incluyen no serán suficientes ya que en última instancia, tendré muchos archivos .cpp y .hpp, por lo que no será complicado. Me gustaría crear una carpeta en la raíz del proyecto llamada "fuente" y luego crear carpetas dentro de "fuente" para las diversas categorías de archivos fuente que me gustaría usar. Cuando hago clic derecho en la solución, solo tengo la opción de agregar un filtro, no una carpeta. Puedo crear carpetas manualmente en el explorador de Windows, luego incluirlas, pero luego pierdo mi capacidad de agregar filtros. ¿Hay alguna forma de agregar nuevas carpetas (sin usar el Explorador de Windows) y seguir usando filtros?
Además, ¿hay algo similar a $ (CURDIR) que podría usar para incluir la carpeta de archivos fuente sin necesitar una ruta absoluta?
Gracias de antemano por la ayuda
El uso de un sistema de compilación como CMake o Premake podría ayudar al organizar archivos, y tiene el beneficio adicional de ayudarlo a portar su código a otras plataformas. Here hay una buena presentación sobre el tema.
Como podría ser de ayuda para alguien, también debería agregar que tener sus archivos fuente separados de su archivo de proyecto ( *.vcxproj
) hace que sea más difícil crear nuevos archivos, ya que Visual Studio de forma predeterminada desea crear nuevos archivos en el mismo carpeta como su proyecto. La solución a este problema que he encontrado hasta ahora es usar la extensión de Asistencia visual, ya que permite agregar nuevos archivos relativos al directorio o a su archivo actualmente abierto. Vea this publicación para una explicación más detallada.
En realidad, es posible ver (y manipular) la estructura de archivos físicos a través de Visual Studio, como se describe en esta publicación SO :
El archivo de encabezado / fuente no es un requisito impuesto por Visual Studio. Ese es solo el diseño predeterminado, y es virtual, no físico. Si hace clic en "Mostrar todos los archivos" en el explorador de soluciones, se mostrará el árbol de carpetas tal como está en el disco duro, que puede manipular como mejor le parezca.
Llego tarde, pero desaconsejo la respuesta aceptada. La razón principal para la portabilidad del código. En cambio, recomiendo:
- Para crear el diseño de carpetas y subcarpetas fuera de Visual Studio (igual que la respuesta aceptada, pero los siguientes puntos son diferentes). Dentro de cada subcarpeta crea una carpeta
include
ysrc
- Luego, en Propiedades de configuración> C / C ++> General> "Incluir directorios adicionales" (para Todas las configuraciones y Todas las formas de las placas), agregue una sola carpeta que sea la base de todas sus subcarpetas.
Para agregarle archivos src e incluye archivos en estas subcarpetas.
Finalmente, incluya cada archivo de encabezado usando rutas de parientes a esta carpeta base.
Para ser claro: si el diseño de su proyecto es el siguiente:
MyProjet
Math
include
random.h
functions.h
src
random.cpp
functions.cpp
Probability
include
normal.h
src
normal.cpp
deberías tener en functions.cpp
la siguiente instrucción include:
#include"Math/include/functions.h"
si también necesita usar el código normal
en functions.cpp, entonces la parte superior de functions.cpp
debería verse así:
#include"Math/include/functions.h"
#include"Probability/include/normal.h"
Al hacerlo, podrá reutilizar su subcarpeta Math en otro proyecto (B) sin ningún problema: simplemente agregando la carpeta base MyProject
en el "Directorio de inclusión adicional" del proyecto B.
El punto clave es tener una sola carpeta base en la propiedad "Incluir directorios adicionales".
ps: la función intellisense de VS 2015 ayuda mucho a escribir el #include...
Si desea crear su solución y proyecto en una ubicación diferente a su código fuente, puede cambiar su directorio de trabajo:
Project > Properties > Configuration Properties > Debugging > Working Directory
Está un poco confundido acerca de cómo funciona Visual Studio con archivos C ++, pero está bien, ya que la documentación es mala. Lo primero es lo primero: a diferencia de C # o Java, la disposición de los archivos en el proyecto no tiene relación con la disposición de los archivos en su disco. Los archivos y las carpetas no están "en" el proyecto, realmente; el proyecto solo enumera los nombres y las rutas de los archivos y carpetas, que ya deben existir en su disco.
En general, crea el diseño de las carpetas, con archivos fuente dentro de esas carpetas. Lo haces fuera de Visual Studio. También creas un archivo de proyecto. Cuando "agrega un archivo" al proyecto, todo lo que hace es indicarle al proyecto dónde encontrar el archivo en el disco.
Trabajemos con un ejemplo específico y le mostraré cómo lo organizaría. Supongamos que está haciendo un programa de calculadora gráfica llamado SuperCalc . Tendrás una carpeta de origen y luego crearás carpetas dentro de Source para guardar los diferentes archivos. Suponga que las carpetas que crea son:
SuperCalc/Source/Input
-
SuperCalc/Source/Math
-
SuperCalc/Source/Math/Matrix
-
SuperCalc/Source/Output
Tienes 3 subdirectorios de Source
: Input
, Output
y Math
. El subdirectorio Math
tiene un subdirectorio llamado Matrix
. Tendrás archivos .cpp en Input, Math, Matrix y Output. Creará estos directorios (carpetas) usando el Explorador de Windows o el Símbolo del sistema.
Ahora también querrá crear un archivo de solución ( SuperCalc.sln
) y un archivo de proyecto ( SuperCalc.vcxproj
y SuperCalc.vcxproj.filters
). Haz eso dentro de Visual Studio. Por lo general, el archivo del proyecto vive en una subcarpeta del directorio de la solución; esto se hará automáticamente por Visual Studio. Elija una ubicación para el archivo de solución: debe estar en algún lugar de la misma estructura de directorios (árbol de carpetas) que el código fuente. Sugeriría ponerlo al lado del directorio de origen, en:
-
SuperCalc/Build
Vaya a VS y seleccione File > New > Project > Visual Studio Solutions > Blank Solution File
. Dale un nombre a la solución (tal vez "SuperCalc") y una ubicación (la ubicación que acabamos de elegir en el directorio SuperCalc/Build
). Creará el archivo de solución para usted.
Ahora haga clic con el botón derecho en la solución en el Explorador de soluciones ("Solución SuperCalc, 0 proyectos") y seleccione Add > New Project
. Elige un nombre: este será el nombre del ejecutable de tu programa, como "SuperCalc". Elija Win32 , ya sea la Aplicación de consola Win32 (este es un programa de consola DOS) o el Proyecto Win32 (este es un programa GUI de Windows normal). Por lo general, luego hago clic en Configuración de la aplicación para hacer algunos cambios importantes: por un lado, elijo Empty Project porque no quiero que Visual Studio cree y codifique archivos a menos que yo lo diga. Cuando todo está configurado como yo quiero, hago clic en FINALIZAR.
Ahora tiene su archivo y proyecto de solución, creado por Visual Studio. También tiene su código fuente, o al menos la estructura de directorios (árbol de carpetas) donde estará su código fuente, creado fuera de Visual Studio. Es hora de conectar las dos cosas juntas.
Si lo desea, puede hacer una lista de todos sus archivos fuente en el filtro Archivos de origen de su proyecto. Aunque procedan de directorios diferentes (Entrada, Matriz, etc.), no se requiere una relación entre las ubicaciones de los archivos en el disco y su apariencia en el proyecto. Pero si tiene muchos archivos, es más fácil si crea "subfiltros", filtros dentro del filtro Archivos de origen y les da los nombres de las subcarpetas de Origen. De esta forma, replicas la estructura de tus directorios de disco dentro de tu archivo de proyecto.
Haga clic con el botón derecho en el filtro Archivos de origen del proyecto "SuperCalc" y seleccione Agregar> Agregar nuevo filtro. Déle el nombre de Input
(el primero de los directorios SuperCalc / Source). También crea los filtros Math
y Output
. Haga clic con el botón derecho en el filtro Math
y elija Agregar> Agregar nuevo filtro, para crear un subfiltro llamado Matrix
(dentro de Matemáticas). Ahora tienes estos filtros :
SuperCalc Source Files Input Math Matrix Output
que es paralelo a los directorios (carpetas) que creó anteriormente. Este es un arreglo puramente conveniente para los humanos . Visual Studio no entiende nada especial al respecto. Si le dice a VS que "agregue un archivo", no colocará el archivo en el filtro correcto. Tendrás que decir dónde ponerlo.
Para agregar o crear sus archivos .cpp, seleccione el nombre del filtro correspondiente al directorio donde se encuentra el archivo .cpp. Por lo tanto, para agregar o crear un archivo SuperCalc/Source/Math/Matrix/matrix_multiply.cpp
, haga clic con el botón derecho en el filtro Matrix
en el Explorador de soluciones y seleccione Agregar> Agregar nuevo archivo o Agregar archivo existente. (Agregar archivo existente es para cuando ya ha escrito matrix_multiply.cpp y solo quiere decirle al proyecto dónde está). Use el cuadro de diálogo para navegar al directorio Source/Math/Matrix
. Repita este proceso para todos los archivos fuente en todo su programa.
También tenía la pregunta "¿hay algo similar a $ (CURDIR) que pueda usar para incluir la carpeta del archivo fuente sin necesitar una ruta absoluta?" Estás de suerte: los proyectos de Visual Studio no usan rutas absolutas. Usan caminos relativos. El archivo de proyecto almacena la ruta relativa requerida para obtener desde el directorio que contiene el archivo .vcxproj al directorio que contiene el archivo fuente. Entonces, si creó SuperCalc.sln
y SuperCalc.vcxproj
donde sugerí (el directorio SuperCalc/Build
), y agrega sus archivos .cpp en los subdirectorios de origen, puede ir a buscar dentro del archivo SuperCalc.vcxproj usando el Bloc de notas, y usted '' Veremos líneas como:
<ClCompile Include="../../../Source/Math/Matrix/matrix_multiply.cpp" />
Como no hay rutas absolutas, podría tomar todo el árbol de directorios de SuperCalc y moverlo a otro lugar, y todo funcionaría. No hay necesidad de hacks de variables de entorno como $ (CURDIR).
Una última cosa que debe saber: dado que está colocando sus archivos de origen en múltiples directorios, puede tener problemas con #include
encabezados, los archivos .h o .hpp. Debe decirle al compilador los directorios donde se encuentran los archivos de encabezado. Probablemente estarán dispersos en múltiples directorios. Por lo tanto, edite la configuración del proyecto: haga clic con el botón derecho en el nombre del proyecto en el Explorador de soluciones, elija Propiedades y vaya a Propiedades de configuración> C / C ++> General. El primer campo de la hoja de propiedades dice "Directorios de inclusión adicionales". Antes de hacer nada más , haga clic en el menú desplegable Configuración y elija Todas las configuraciones . Si tiene una compilación tanto de 32 bits como de 64 bits, haga clic en el menú desplegable Plataforma y elija Todas las plataformas . Ahora vaya a "Directorios de inclusión adicionales" y agregue todas las rutas a todos los directorios de origen, con las rutas especificadas en relación con el directorio del archivo de proyecto. Entonces, para el ejemplo de SuperCalc, se vería así:
../../../Source/Input;../../../Source/Math;../../../Source/Math/Matrix;../../../Source/Output
Una vez que se realiza este cambio, un archivo como Source / Math / Matrix / matrix_multiply.cpp puede tener una línea
#include "input_configuration.hpp"
para #incluir un archivo del directorio de Entrada, y All Just Work.
(Si no todo funciona, el enfoque habitual es volver a las propiedades del proyecto y jugar con el número de secuencias delante de sus directorios de inclusión adicionales. Recuerde que cada vez que vaya a hacer un cambio debe elija Todas las configuraciones nuevamente; de lo contrario, los cambios solo se aplicarán a la Configuración actual (Depuración o Versión). Esa configuración no es adherente ).