Tag Archives: Visual Studio

Using open-source libraries for MyModeler C++ project

I will make some enhancements to my modeler project (http://ultrafluid.codeplex.com). I have moved to Visual Studio online.

image001

MyModeler

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.

Using log4cpp with Visual Studio 2015

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