因为科研项目需要用到动态链接库dll项目,但是编译通过之后,dll项目是无法在本地运行的,因为需要有调用dll的主函数或者exe来。科研项目的代码在编译成功之后生成一个dll,然后在另一个软件中调用这个dll里面的函数(软件有一个接口供调用使用)。这时dll中写的代码就运行了。但是因为你无法查看到代码中的一些详细信息,只能在软件中看到调用之后的最后结果。于是,在经过查阅之后,发现可以用c++中的日志库log4cpp来解决dll项目无法查看某些信息的这个问题。log4cpp博客上有很多介绍的,不多说。其主要有三个概念,简言之,Category负责向日志中写入信息,Appender负责指定日志的目的地,Layout负责设定日志的格式。
参考博客上网友的代码如下:
log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();
pLayout1->setConversionPattern("%d: %p %c%x: %m%n");
log4cpp::PatternLayout* pLayout2 = new log4cpp::PatternLayout();
pLayout2->setConversionPattern("%d: %p %c%x: %m%n");
log4cpp::Appender* fileAppender = new log4cpp::FileAppender("fileAppender","wxb.log");
fileAppender->setLayout(pLayout1);
log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender( "rollfileAppender","rollwxb.log",5*1024,1);
rollfileAppender->setLayout(pLayout2);
log4cpp::Category& root =log4cpp::Category::getRoot().getInstance("RootName");
root.addAppender(fileAppender);
root.addAppender(rollfileAppender);
root.setPriority(log4cpp::Priority::DEBUG);
for (int i = 0; i < N_VARS; i++)
{
string strError;
ostringstream oss;
//oss<<i<<":RootError Message!"<< "\n";
oss<< " X(" << i + 1 << ") = " << Population[GROUP_SCALE].Xn[i] << "\n";
strError = oss.str();
root.error(strError);
}
log4cpp::Category::shutdown();
这段代码粘进项目中之后,在软件调用运行之后,在调用软件的安装文件中会出现一个wxb.log文件,这里面主要记录了自己想要查看的Population[GROUP_SCALE].Xn[i]的所有值。
过程中遇到的几个问题:1)LNK2038:检测到“RuntimeLibrary”...(具体不记得了)网上的解决办法是:(项目属性——c/c++——代码生成——运行库)改为多线程MTd,并没有解决,自己的代码因为是dll项目,所以改为——多线程调试Dll,问题解决。2)fatal error C1189:Building MFC application with /MD ...解决:项目——属性——常规——MFC使用——在共享Dll中使用MFC,问题解决3)error:LNK1104:无法打开文件“.\debug\**.dll”,这个问题比较傻,一直在想为什么打不开要生成的dll呢???后来发现自己的调用软件在开着,占用着当前的dll,当然不能生成新的了。。。关掉占用dll 的软件,问题解决。