One moment, please – 19 comments
August 10th, 19 0. There is a lot of hype and perhaps restraint to using modules in projects. The general blocker tends to be build support, but even with good build support there is a distinct lack of useful resources for practices around moving projects to using named modules not just header units. In this blog we will take a small project I created, analyze its components, draft up a plan for modularizing it, and execute that plan.
I remember when I was younger, I used to love doing kid things like eating terrible fast food, but going to these restaurants had an additional perk: the play places! One of my favorite things to do was go to the ball pit, dive in, and make a giant splash of color. I shudder to think of going into one nowadays, but I have not forgotten how much fun they were.
I have also recently become very inspired by OneLoneCoder on YouTube and his series on programming simple physics engines. Without further ado, here is the code in all its include glory: Ball Pit!
Without modules. Once CMake has generated the solution for you can open it using Visual Studio , use the familiar F5 loop and off you go! Let us talk briefly about the traditional project structure of this code.
We have the following, familiar, breakdown:. You also end up with a sizeable set of includes in our primary ball-pit. Since we made the decision to use header files you will notice that we get some declarations like this:. Where there is a strong desire not to implement this simple function in its own. The PGE header is isolated into its own bridge called pge-bridge. Finally, for projects which utilize include as a code sharing mechanism, I like to employ the idea that each header file should stand completely on its own, meaning that if a header uses something like std::vector it cannot rely on that container being introduced through some other header, it must include it itself.
This is good practice; it makes maintaining headers minimal as you move them around and use them in more places. By default, MSBuild will key off any source files with a. Now, how do we get there? It is common for mature projects to have a similar structure and breakdown of components and it makes sense for maintainability reasons. Let us do exactly that by introducing some new files into the directory tree which reflects our header file layout making them empty for now :.
When tackling a project of any size you want to start as small as you possibly can. The first thing you need to do is add the content to your module interface:. There is one last thing missing: we did not actually export anything! Take a look:. Finally, we add this new interface to the CMakeLists. Things should run the same as before except that we are one step closer to modularizing the project! Named modules are all about defining the surface area of your API. Now that we have a tool which allows us to hide implementation details that would otherwise be unnecessary for consumers, we can start to think about what the accessible parts of the API should be.
In this file we have the following declarations:. As such we can define the module like so:. Notice that we do not even need to export the declaration of the class RandomNumberGenerator. Do not be afraid to put compiled code in an interface, it is its own translation unit and obeys the rules of compiled code. When we move code into a modules world, and in particular 3rd party code, we need to take some things into consideration: what part of the library do we want to expose?
What runtime requirements are in the library if it is header only? With modules we start to have answers to these questions based on the requirements of our project. Integrating 3rd party library functionality into modularized projects is one of the most interesting parts of using modules because modules give us tools we never had before to deal with ODR One Definition Rule and name resolution.
It is easy to integrate into projects because it is a single header file and the interfaces are simple—which plays to our advantage in deciding what parts of the library we want to expose. You will immediately notice that the color constants are mysteriously missing. This is because these constants are defined with static linkage in the header file so we cannot export them directly and the reason is buried in standardese.
It is simpler to remember that you cannot export an internal linkage entity i. The way to get around this is wrap them in a function which has module linkage:. Once we have these functions, we need to replace any instance of olc::COLOR with its respective call to our exported color function. And that is it!
Just as before, you add this to the CMakeLists. Once you have gone through the exercise of modularizing more and more of the project you might find that your main program begins to reflect the header file version:. To understand what I am talking about let us look at a header file equivalent of grouping common functionality. The problem, of course, is while this is convenient and you do not need to think about which specific file to include for your current project, you end up paying the cost of every header file in the package regardless of if you use it or not.
We can also do the same for anything under Util. This leads us to a rather, I think, respectable looking ball-pit. It was a little bit of a journey getting here, and there are learnings along the way. You can check out the code, configure, and build it the same as we covered earlier using Visual Studio version With modules there is an up-front cost in building our interfaces. With the old inclusion model, we did not have to build our include files explicitly only implicitly.
We end up building more up front, but the result is that we can REPL our main program and its components much, much faster. Here is a snapshot of the difference:. Note: these times were an average of 10 runs. You can see the results yourself by observing the c1xx. The process of using named modules in complex projects can be time consuming, but this type of refactor pays off in both reducing development costs associated with recompiling and code hygiene.
Named modules give us so much more than simply better compile times and in the above we have only scratched the surface of what is possible. Stay tuned for more modules educational content from us in the future! As always, we welcome your feedback. Feel free to send any comments through e-mail at visualcpp microsoft. Also, feel free to follow me on Twitter starfreakclone. For suggestions or bug reports, let us know through DevComm.
Comments are closed. Glad to see another one of these modules post, converting a larger scenario with open source dependencies. If a large enough program uses this library, and one of its dependencies imports this library while another dependency includes it, will we properly get one instantiation of SomeSymbol code?
Is that you are having the module interface take ownership over that class and as a result the module will own definitions within that class. It is one of the reasons why you might see linker errors by doing this and why we recommend the using-declaration approach. Yes, this is expected because the using-declaration always expects a qualified name. If you want the sample to work you will need to do the following:. Builds fine now — TY. What version of Visual Studio are you using?
The sample above will only work with Visual Studio Should there be any changes to the CMakeLists. Compiling a module interface will produce a. If so, how? The answer to the first question is explained here. MSBuild is doing the heavy lifting for us in this case. Eventually CMake will do it all by itself though. Adding the. The way I got CMake to recognize the. I followed some SO questions which ultimately led me to the following pattern:.
This should be all you need to get started, then simply add your interfaces to the sources list so the resulting generated MSBuild can pick them up. When I try to use module Bridges. PGE, there are some thing strange. Can you tell me the series of steps that led to to this error? Great article. Is the cmake trick enough for linking a DLL built with modules as well? If I reference modules from the DLL in the executable, will msbuild know that those are from the other project? So far, all we get are hints of shorter build times.
Not everyone is willing to rearchitect their project for a hypothetical build speedup. You hint at other advantages in your conclusion. I would really appreciate it if you and other authors would focus more on the motivation for a feature BEFORE telling us how to use it.
With all due respect, that seems like the natural order of presentation. I agree completely with Paul Topping.
Software requirements for Project Server – Project Server | Microsoft Docs
Your install is finished when you see the phrase, “You’re all set! Microsoft Project Standard Features Resource management made easy Resource rates are used to calculate allocation costs, which are accumulated and summarized at the resource level. Tip: To install Project in a different language, or to install the bit version, select the link Other options. You can now easily copy project information and paste it into Office applications such as Word and Powerpoint. After that, you can use MS Project for free within the trial. How long does a genuine software license last?
Download Microsoft Project for Windows 10 for free – SoftRAR – Hardware requirements for Project Server 2013
Learn what this means for you and how to safeguard your data estate. Browse through the most memorable and most impactful content from our recent digital event by topic. Azure Purview is now generally available! Learn how to maximize the value of your business data with Azure Purview at the Azure data governance digital event.
Gain insights from all your data by querying across your entire data estate without moving or replicating the data. Get the flexibility to use the language and platform of your choice with open source support. Take advantage of breakthrough scalability and performance to improve the stability and response time of your database—without making app changes.
Get high availability for mission-critical applications, data warehouses, and data lakes. Achieve your security and compliance goals using the database rated as least vulnerable over the last nine years. Stay a step ahead using built-in features for data classification, data protection, and monitoring and alerts [ 1 ].
Benefit from a consistent, unified experience across your entire SQL portfolio and a full range of deployment options from edge to cloud. Get the resources and information you need to start your SQL Server migration. The intelligent query processing feature has increased the speed and processing power of our business. We get a lot from SQL Server—reliability, scalability, integration, and agility. Try SQL Server Industry-leading performance and security with SQL Server Regardless of where your data is stored, query and analyze it with the data platform known for performance, security, and availability.
Try now. Introducing SQL Server Now in public preview. Learn more. Microsoft Ignite Browse through the most memorable and most impactful content from our recent digital event by topic. View on-demand sessions. Azure data governance digital event Azure Purview is now generally available! At least MB of free space on the drive that contains the message queue database. Exchange binaries. Files generated by Exchange diagnostic logging.
Transport database files for example, the mail queue database. ReFS : Supported on partitions that contain the following types of Exchange files: Mailbox databases.
Transaction logs. Installing Exchange on a computer that’s running Windows Server Core is fully supported and recommended. The Desktop Experience feature is no longer required. Exchange servers support the version of PowerShell that’s included in the release of Windows Server where Exchange is installed. Other software that you want to install on an Exchange server needs to be designed to run on the same computer as Exchange Server.
We strongly recommend that you use the latest version of the. NET Framework that’s supported by the release of Exchange you’re installing.
Releases of. NET Framework that aren’t listed in the table below aren’t supported on any release of Exchange This includes minor and patch-level releases of. NET Framework. The complete prerequisite list for Exchange is available here.
Otherwise, Outlook and will not work on Windows 7. If you’re integrating Lync presence and instant messaging with Exchange Server, Lync Server Cumulative Update 10 or later is required. The following table lists the scenarios in which coexistence between Exchange and earlier versions of Exchange is supported. For more information about specific hybrid deployments, see Hybrid Deployment Prerequisites. The following table lists the requirements for the network and the directory servers in your Exchange organization.
The use of bit Active Directory domain controllers increases directory service performance for Exchange In multi-domain environments, on Windows Server domain controllers that have the Active Directory language locale set to Japanese ja-jp , your servers may not receive some attributes that are stored on an object during inbound replication.
For more information, see KB For security and performance reasons, we recommend that you install Exchange only on member servers and not on Active Directory directory servers. To learn about the issues you can face when installing Exchange on a directory server, see Installing Exchange on a domain controller is not recommended [WarningInstallExchangeRolesOnDomainController].
After Exchange is installed, changing its role from a member server to a directory server, or vice versa, isn’t supported. Content indexing files. The Windows Server Desktop Experience feature needs to be installed. To install Exchange , you need to do one of the following steps to install the Desktop Experience on Windows Server prior to starting Exchange Setup:. If a computer is running Windows Server Core mode and you want to install Exchange on it, you’ll need to reinstall the operating system and choose the Desktop Experience installation option.
Exchange only supports the version of Windows Management Framework that’s built in to the release of Windows that you’re installing Exchange on. Don’t install versions of Windows Management Framework that are made available as stand-alone downloads on servers running Exchange. Software that you want to install on an Exchange server needs to be designed to run on the same computer as Exchange Server. We strongly recommend that you use the latest version of.
NET Framework that aren’t listed in the table below are not supported on any release of Exchange For older versions, see Exchange Server supportability matrix. Exchange Server offers several well-known protocols, and publishes APIs that third-party vendors often write clients for.
Microsoft makes no warranties, expressed or implied, as to the overall suitability, fitness, compatibility, or security of clients that are created by third-party developers. If you want to use a third-party client that uses our protocols or APIs, we recommend that you thoroughly review and test all considerations functionality, security, maintenance, management, and so on before you deploy the client in the enterprise workspace.
We also recommend that you make sure that the third-party vendor offers an appropriate Enterprise Support Agreement ESA. Skip to main content. This browser is no longer supported. Download Microsoft Edge More info. Table of contents Exit focus mode. Table of contents. Supported coexistence scenarios for Exchange The supported coexistence scenarios between Exchange and earlier versions of Exchange are described in the following table: Exchange version Exchange organization coexistence Exchange and earlier versions Not supported Exchange Supported with Exchange Cumulative Update 21 CU21 or later on all Exchange servers in the organization, including Edge Transport servers.
Exchange Supported with Exchange CU11 or later on all Exchange servers in the organization, including Edge Transport servers. Mixed Exchange and Exchange organization Supported if all Exchange and Exchange servers in the organization meet the requirements as previously described in this table.
Supported hybrid deployment scenarios for Exchange Exchange supports hybrid deployments with Microsoft or Office organizations that have been upgraded to the latest version of Microsoft or Office Network and directory server requirements for Exchange The requirements for the network and the directory servers in your Exchange organization are described in the following table: Component Requirement Domain controllers All domain controllers in the forest need to be running one of the following versions of Windows Server: Windows Server 1 Standard or Datacenter Windows Server Standard or Datacenter Windows Server Standard or Datacenter Windows Server R2 Standard or Datacenter Active Directory forest The Active Directory forest functional level is Windows Server R2 or higher.
Active Directory site The Active Directory site where you install the Exchange Server must contain at least one writeable domain controller that’s also a global catalog server, or the installation will fail.