I have tested C# compilation under VS Online.
This kind of paid products is not for me. As a developer, I build on a local machine and I want to be offline and not always connected. More, I don’t want to pay for and IDE and a free compiler.
Visual C++ and Native Development (C++ Renaissance) and .NET Technologies and life's stuff on computers
I will make some enhancements to my modeler project (http://ultrafluid.codeplex.com). I have moved to Visual Studio online.
My project use three open-source projects:
– Scintilla (http://www.scintilla.org/)
– MFC Naughter classes to encapsulate Scintilla edit control with MFC (http://www.naughter.com/scintilla.html)
– Boost (http://www.boost.org/)
My project was primary built in the 2012′. It was an idea to make my daughter Lisa able to place elements with the mouse.
It is a family project. It was also an free-time occupation when I was consultant for the “Banque de France” to build Architecture diagrams.
The initial goal of the project is to build diagrams with individual shapes elements. These elements contains properties and everything is store in a database.
Then, it is possible to make requests to find things. For the moment, I have no database. I need to implement that part of the software.
First surprise when I rebuilt the project with the latest version of Scintilla, the Naughter classes produced C++ compilation errors.
I needed to get the latest classes but also make some minor corrections (hide the code of 2 methods).
For boost, I have a version 1.59 on my computer and I have no evidence to jump to the latest version because I just use serialization and XML stuff which belong to a very stable library : serialization.
I rebuilt the project and it just works. The project updated to MSVC140 build tools with Visual Studio 2015.
This is the magic of C++ : it works along all theses years… But my open-source libraries has evolved and most of the time, getting an updated version can bring some changes.
In my case, the Naughter MFC classes depends on Scintilla project so the GET operation must assure that the 2 projects are synced.
First, let’s download log4cpp from sourceforge: http://log4cpp.sourceforge.net/
Log4cpp version is log4cpp-1.1.2rc5.
Let’s open log4cpp-1.1.2rc5log4cppmsvc10log4cpplog4cpp.vcxproj in VS2015. Try to build it. It fails. 2 errors…
snprintf & vsnprintf stuff. Ugly & cryptic error. Multiples definitions of body…
Let’s dive in the source code and we can see that a preprocessor declaration will help us.
Add HAVE_SNPRINTF to the project settings in preprocessor stuff. Build it. It is ok.
1> Creating library Debuglog4cpp.lib and object Debuglog4cpp.exp
1> log4cpp.vcxproj -> D:Devcpplog4cpp-1.1.2rc5log4cppmsvc10log4cppDebuglog4cpp.dll
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
Now, let’s build a sample client for using this dll.
We add a Win32 console project to the solution.
Add include folder to the client project:
Add the library folder to find the .lib file:
Add in your stdafx.h the following code:
#pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> #include <string> #include <iostream> using namespace std; #include <log4cpp/RollingFileAppender.hh> #include <log4cpp/Category.hh> #include <log4cpp/Configurator.hh> #include <log4cpp/Portability.hh> #include <log4cpp/PropertyConfigurator.hh> #pragma comment(lib, "log4cpp.lib")
The main program just put some data in file:
#include "stdafx.h" #include "Logger.h" int main() { MyLogger log; if (!log.Init()) return 0; log.LogDebug("Enter main..."); log.LogInfo("Main..."); log.LogDebug("Exit main"); return 0; }
All the magic is contained in this code snipet:
#pragma once class MyLogger { public: MyLogger() { } virtual ~MyLogger() { log4cpp::Category::shutdown(); } bool Init() { try { string initFileName = "log4cpp.property"; log4cpp::PropertyConfigurator::configure(initFileName); } catch (log4cpp::ConfigureFailure& f) { std::cout << "Configure Problem" << f.what() << std::endl; return false; } return true; } void LogDebug(string message) { log4cpp::Category & mylogger = log4cpp::Category::getInstance("MyLogger"); mylogger.debug(message); } void LogInfo(string message) { log4cpp::Category & mylogger = log4cpp::Category::getInstance("MyLogger"); mylogger.info(message); } };
The configuration file is defined like:
#file log4cpp.property
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.MyLogger=DEBUG, aLogger
log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=BasicLayout
log4cpp.appender.aLogger=RollingFileAppender
log4cpp.appender.aLogger.fileName=c:tempaLogger.log
log4cpp.appender.aLogger.maxFileSize=10240
log4cpp.appender.aLogger.maxBackupIndex=5
log4cpp.appender.aLogger.layout=PatternLayout
log4cpp.appender.aLogger.layout.ConversionPattern=[%d{%H:%M:%S,%l}] %m%n
#end of file