4.2 KiB
Solution and Project File Structure
- A solution file (
*.slnor*.slnx) contains multiple project files. - Typical C++ project files are XML files in
*.vcxprojor*.vcxitemsnaming. - The XML file
*.vcxitems.filtersor*.vcxproj.filtersorganizes source files in solution explorer folders (virtual folders) that can be different from the physical file system, creating a human-friendly view. - The XML file
*.vcxproj.usercontains some temporary local configuration for a project. This file is not tracked by git, but it contains arguments for running the project. - When adding a source file to a specific solution explorer folder:
- It must also be added to one or multiple project files.
- Find the
*.vcxitems.filtersor*.vcxproj.filtersfile with the same name. - Each file must be attached to a solution explorer folder, described in this XPath:
/Project/ItemGroup/ClCompile@Include="PhysicalFile"/Filter. - Inside the
Filtertag there is the solution explorer folder. - Edit that
*.vcxitems.filtersor*.vcxproj.filtersfile to include the source file.
- Wild card is NOT ALLOWED in project files, each file should be enumerated one by one.
Renaming and Removing Source Files
- All affected
*.vcxitems,*.vcxproj,*.vcxitems.filtersand*.vcxproj.filtersmust be updated.
Adding new C++ Project
- There are two kinds of projects:
*.vcxprojand*.vcxitems.- Usually
*.vcxprojcomes with a*.vcxproj.filtersbecause solution explorer organization of source files are always needed. - Usually
*.vcxitemsdoes not come with a*.vcxitems.filtersbecause all files are just listed below the project in the solution explorer.
- Usually
- When adding a new project, find a existing project to copy.
- For a typical
*.vcxprojproject, there will always be solution explorer foldersHeader Files,Resource FilesandSource Files.Header FilesandResource Filesshould be kept during copy even when there will be no files adding to them.Header Filesis never used, all source files, including header files, should be inSource Filesor custom created folders.- If all options are correctly copied from another
*.vcxprojfiles, it should be good but you still need to make sure that:DebugandReleaseare always needed.Win32andx64are always needed.- All configuration should define
VCZH_DEBUG_NO_REFLECTIONmacro, unless there is special requirement to enable C++ reflection. - All
Debugconfiguration should defineVCZH_CHECK_MEMORY_LEAKS.
- When
*.vcxprojis added to the solution, you need to build the solution against all configuration to make sure everything works:DebugandRelease.Win32andx64.- Even if you find any pre-existing issues, you should fix them.
- You can skip the test, as adding new project should not affect test cases, unless existing projects are modified as part of the refactoring.
- Only add the
/bigobjcompiler option to a*.cppfile when needed.
Working on Linux
makefile for each project is generated from MSBuild project files during the build.
When the file list needs to be modified, update MSBuild project files directly.
After building, vmake file generates both vmake.txt and makefile.
If you doubt whether the file is built or not, check out vmake.txt, which simply lists all used cpp files in makefile.
Linux specific C++ source files also need to be added to MSBuild project files, and they are excluded from the build.
In vmake, Windows specific C++ source files need to be excluded.
When the Main.cpp from MSBuild projects or similar files does not work on Linux, you are recommended to create one for Linux.
In vmake, these variables are available for configuration, most of them are optional:
CPP_VCXPROJS: Use MSBuild project files, they are typically*.vcxitemsor*.vcxproj.CPP_REMOVES: Files to exclude, from the file list generated fromCPP_VCXPROJS.CPP_ADDS: Files to add.CPP_COMPILE_OPTIONS: Extra compiler options forclang++org++.FOLDERS: Folders that contain generated files. These folders will be completely removed during a full build.CPP_TARGET: The compiled binary.
Working on Mac
(to be editing...)