Anyway to stop 2008 and 2012 Visual Studio builds mixing through TeamCity? - c++

I have a legacy system, with C++ dlls, libs, and exes.
We build against either 2008 or 2012.
Obviously if a 2008 dll gets accidentally added to a 2012 build via TeamCity. That will be bad. Crashy. And vice versa.
So does anyone know of a way to get TeamCity to stop that being able to happen. I feel it must be possible as TeamCity runs the builds and as such 'knows' how each artifact was created. Surely there is some way to create a rule or such like that says 'Only 2008 artifacts for this build, otherwise error'?
Can I setup TeamCity to stop accidental 2008 and 2012 build mixes happening? (without using magic).
Ta!
Example:
My2008TeamCity build (Product built using 2008)
Requires artifacts a2008, b2008, c2008
My2012TeamCity build (Product built using 2012)
Requires artifacts a2012, b2012, c2012
The artifacts are DLL's and loaded at run time only.
Recently we ran the My2008TeamCity build.
A few of the artifacts had mistakenly been setup, through TeamCity to come from 2012 builds.
i.e. a2012 was added to a 2008 build as an artifact.
As the DLL is only loaded run at runtime, we didn't notice the problem until the code was manually run, and that part of the code hit.
Now imagine a huge system, with loads of artifacts, many developers working on subprojects constantly... and something that can guard against this happening suddenly feels required.
Ideally I would like TeamCity to say 'No this artifact was build against 2012, and you are running a 2008 build' and fail the build. So we can fix it.
X

I not clearly sure, are you using all of this in one solution? You can use separate folders of VCS(Build Configuration Settings\Version Control Settings\Edit checkout rules) and for configuration "2012" take only this folder from VCS.

Related

Has anyone successfully modified vcvars*.bat in Visual Studio to point to a shared build tools location and been able to use MSBuild?

Our group has some simple regression machines that build different C++ code bases regularly, and they all use different versions of the Visual Studio build tools. Rather than try to install a lot of different versions of Visual Studio on the build systems, the tools are copied to a standard mounted location and used from there.
Now, the team that set this system up uses a custom build system rather than MSBuild, but I am trying to use these machines with MSBuild (which is also copied to the mounted location) to build an existing VS solution file. Does anyone know how to modify a vcvars batch file enough so that these tools being in an alternate locations will work properly without having to install anything to the build node?
Not sure what point you want to describe. And as far as I know, you can just download the msbuild open source code and then basically add your custom build tool to the msbuild code.
In this way, the generated new msbuild tool is perfectly embedded with your custom tool. This is the best solution.
Simply changing the vcvars*.bat and other related files on the msbuild folder of vs2019 is not helpful. You must start at the stage of msbuild development.
And thanks for Microsoft to open up the source code of msbuild, in fact, this is to facilitate users to embed custom tools.

remove msvc dlls dependency to run qt application

How to remove msvc dlls (example: msvcr100.dll) dependency to run qt appliation?
I've developed a qt application which runs just fine in dveloper machine but unable to run on any other machine gives error message "program can't start because MSVCR100.dll is missing from your computer". I can solve this error by copying that file in the application folder but I dont want to copy, instead I want to link statically or some other way to remove that dependency.
Thanks in advance
The issue is that you are probably trying to run an application on a machine which has a different Visual Studio (MSVC) version installed than the version that was used for building your application itself.
Generally, the correct solution is to install the corresponding Visual Studio redistributable package on the target machine. It is not a "workaround" or "hack" because if you wish to use an application built with different runtime libraries, etc, then it is expected. Here you can read a bit more about it:
Redistributing Visual C++ Files
Yes, it is a bit unfortunate, and apparently MS has not managed to make it the most ideal, but after all, it is simple enough to circumvent. Note that the target machine would not only have issues with your application, but in general with any distributed in a similar fashion.
The other way to solve the issue is to build the application with the same environment that is installed on the target machine, but this can easily go haywire if you need to supply the application to several machines with versatile setup. Now, I would say this is the "hackish" approach.
You will need to grab the redistributable for this particular problem from here:
Microsoft Visual C++ 2010 Redistributable Package (x86)
Microsoft Visual C++ 2010 Redistributable Package (x64)
Even if you went down for statically hacking this around somehow, you would need to deal with nasty consequences when using your application with DLLs and static libraries, etc.
As far as I know, you can't link statically to Visual Studio Redistributable. Any application built with Visual Studio Compiler needs the corresponding msvcXXX.dll to run. Installers containing all dll for each specific version of MSVC are available here: http://search.microsoft.com/en-us/DownloadResults.aspx?q=redistributable
If you want avoid errors for your users when you distribute your application, you have some solution. A commonly used is to install the right redistributable package before installing your application on the user machine. Often used tools (NSIS, Inno Setup, etc.) have options to run other executable in the process. And each Microsoft redist package can be run silently (without any window display to user).
Note: This problem is absolutely not related to qt. It comes directly from the compiler you choose.

Visual Studio 2010 conversion of 2005 solutions (C++ projects) loses project dependencies

I am trying to convert one rather huge VS2005 solution with many C++ projects to VS2010. After automatic conversion I can see that some of the dependencies between the projects were lost and thus my VS2010 builds fail unless I manually re-add the dependencies.
Has anybody seen this behaviour?
Is there a fix for this?
Can I avoid having the dependencies dropped during the conversion by changing/fixing the VS2005 solutions/projects?
EDIT: And another conversion artefact is that like three header files in a single project are suddenly considered C++ source files (instead of just header files) and their compilation is attempted. The compilation subsequently fails because they do not include stdafx.h.
VS2010 project conversion is fraught. And if you haven't applied VS2010 Service Pack 1 you will almost certainly be wasting your time.
Regarding project dependencies (you might not like this): MSBuild 4.0 (the VS2010 build agent) no longer looks in the solution file for project dependencies. Even if you managed to get your solution to build okay in the IDE, if you ever plan to build your solution from command-line build scripts, or a TFS build server, then all your project inter-dependencies must be applied in each project. Otherwise your projects will almost certainly build out of order, especially on multi-core machines where, by default, MSBuild 4.0 uses as many cores as it can find.
My team had to bite the bullet and manually recreate project dependencies in each project so the VS2010 solutions would build correctly in both Visual Studio and our TFS build servers.
I had a similar problem and here's what I did: first convert from 2005 to 2008 then from 2008 to 2010. This helped me.

Install msvcr80d.dll

For reasons beyond my control, an app I am working on deploying needs to use the debug version of the Microsoft Visual C++ 2005 library. I tried to register the msvcr80d.dll with regsvr32.exe and it fails. Is there a work around to get the debug libraries to register?
They shouldn't be registered, and the debug version isn't redistributable. It's best to fix the build of your project to get rid of the debug build, because you can't deploy it this way.
this is the visual studio run time library debug version. besides being non optimized this dll contains additional code to detected various run time errors. you should not use that for distribution, in addition to being slower your application might display all sorts of ungainly debug message boxes. skip the shortcut and recompile a release version.
This dll do not export DllRegisterServer and so cannot (and should not) be registered with regsvr32
If you install VC++ 2005 Express edition on each target PC that should include the non-redistributable DLLs. Then maybe you can deploy your app on those PCs.

Visual C++/Studio: Application configuration incorrect?

My C(++) program, written and compiled using Visual C(++)/Visual Studio, runs fine on my own machine, but refuses to run on another machine. The error message I get is "This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem."
If you write a C++ program, it links dynamically to the C Runtime Library, or CRT for short. This library contains your printf, your malloc, your strtok, etcetera. The library is contained in the file called MSVCR80.DLL. This file is not by default installed on a Windows system, hence the application cannot run.
The solution? Either install the DLL on the target machine through VCREDIST.EXE (the Visual C++ Redistributable Package), or link to the CRT statically (plug the actual code for the used functions straight into your EXE).
Distributing and installing VCREDIST along with a simple application is a pain in the arse, so I went for the second option: static linking. It's really easy: go to your project's properties, unfold C/C++, click Code Generation, and set the Runtime Library to one of the non-DLL options. That's all there is to it.
The problem here is a missing DLL dependency, such as the CRT (C Runtime Library). A good tool for diagnosing this sort of problem is Dependency Walker (depends.exe), which you can find here:
http://www.dependencywalker.com/
You would run this program on the computer that generates the error message you posted, and use it to open the exe that's generating this error. Dependency Walker will quickly and graphically indicate any DLLs that are required but not available on the machine.
Chances are high that you miss the runtime libraries of Visual Studio (CRT amongst others), you can either get rid of those dependencies (link statically) or install the VC redist packages on the target computer.
Depending on the Visual C++ version you use, you have to install different packages :
Visual C++ 2005
Visual C++ 2005 SP1
Visual C++ 2008
Warning : those packages only contain release versions of the libraries, if you want to be able to distribute debug builds of your application you'll have to take care of the required DLL yourself.
It is much the simplest to link to the runtime statically.
c++ -> Code Generation -> Runtime Library and select "multi-threaded /MT"
However, this does make your executable a couple hundred KByte larger. This might be a problem if you are installing a large number of small programs, since each will be burdened by its very own copy of the runtime. The answer is to create an installer.
New project -> "setup and deployment" -> "setup project"
Load the output from your application projects ( defined using the DLL version of the runtime ) into the installer project and build it. The dependency on the runtime DLL will be noticed, included in the installer package, and neatly and unobtrusively installed in the correct place on the target machine.
The correct VC Redist package for you is part of your Visual Studio installation. For VC 8, you can find it here:
\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
POSSIBLE SOLUTION........
EDIT: (removed most of my post)
Long story short, I was having similar problems, getting the "Application Configuration Incorrect" messages, etc etc.
Depends.exe was only finding ieshims.dll and wer.dll as possible issues, but this is not the problem.
I ended up using the Multithreaded (/mt) compile option.
What HAS worked though, as a workable solution, is making an installer with InstallShield.
I've selected several merge modules in installshield builder and this seems to have fixed my problem. The modules selected were:
VC++ 9.0 CRT, VC++ 9.0 DEBUG CRT, and the CRT WinSXS MSM merge module.
I'm pretty sure its the WinSXS merge module that has fixed it.
DEBUG CRT: I noticed somewhere that (no matter how hard I tried, and obviously failed thus far), my Release version still depended on the DEBUG CRT. If this is still the case, the InstallShield merge module has now placed the DEBUG CRT folder in my WinSXS folder :) Being somewhat of a novice with VC++ I assume that this would normally be used to distribute debug versions of your programs to other people. To test if this is what fixed my problem I removed the DEBUG CRT folder from the WinSXS folder and the application still worked. (Unless something is still running in the background etc etc - I'm not that into it)
Anyway, this has got things working for me on an XP SP3 fully updated machine, and also on a VMWare XP SP3 machine with the bare bones (.net 3.5 and VC++ 2008 RTM basically) - and also on a mate's XP machine where it previously wasn't working.
So give these things a try, you might have some luck.
First thing you must use
#define _BIND_TO_CURRENT_VCLIBS_VERSION 1
or add _BIND_TO_CURRENT_VCLIBS_VERSION=1 to the preprocessor directives.
The problem is related to binding and the manifest types, you can find more http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/
By doing this your application will run with a larger range of runtime libraries versions.
Often times this error is the result of attempting to run the debug version of an application that uses .NET. Since the .NET redistributable package doesn't include the debug versions of the dlls that are installed with Visual Studio, your application will often get this error when running it on any other machine that doesn't have Visual Studio installed. If you haven't already, try building a release version of your application and see if that works.
Note also - that if you change to static runtime, you will have to do the same for MFC if your app uses MFC. Those settings are in properties->Configuration/General
I ran into this problem and was able to fix it very simply.
Visual studio gives you the option (on by default) to build a manifest for each build.
The manifest was put in the release folder, but it was a different release folder than the exe.
Even when using the setup utilities it was not packaged.
You should look for a file names something like myprogram.exe.indermediate.manifest
If this is in the same folder as the exe (and you have all the dlls) it should run