交叉编译ARM平台的log4cpp、log4c,支持属性配置

宿主机环境:Ubuntu 12.04  64bit

ARM平台交叉编译工具链:arm-hisiv600-linux-

 

下载目前最新版 log4cpp,目前是 log4cpp-1.1.3.tar.gz

https://sourceforge.net/projects/log4cpp/

解压该压缩包到任意一个目录

tar -xzf log4cpp-1.1.3.tar.gz

同时新建一个目录用来装编译生成的头文件和库文件(如果不想默认装在 /usr/local 路径的话)

mkdir xxx

安装说明和示例代码可以参考:log4cpp/doc/html/index.html

 

Ubuntu宿主机配置安装

cd log4cpp

./configure --prefix=/home/admin/xxx

make

make install

这时去到 xxx 目录下,会看到有 include 和 lib 目录生成

cd xxx

新建一个 cpp 文件

touch log_test.cpp

// log_test.cpp

#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>

int main(int argc, char* argv[])
{
    std::string initFileName = "log4cpp.properties";
    log4cpp::PropertyConfigurator::configure(initFileName);

    log4cpp::Category& root = log4cpp::Category::getRoot();

    log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));

    root.warn("Storm is coming");

    sub1.debug("Received storm warning");
    sub1.info("Closing all hatches");
    sub1.info("All hatches closed");

    root.info("Ready for storm.");
    root.log(log4cpp::Priority::INFO, "log4cpp test log [%s:%u]", __FILE__, __LINE__);

    sub1.log(log4cpp::Priority::ERROR, "[%s:%u] log4cpp test log", __FUNCTION__, __LINE__);

    log4cpp::Category::shutdown();

    return 0;
}

新建一个属性配置文件 log4cpp.properties,与 log_test.cpp 同在一级目录

touch log4cpp.properties

# log4cpp.properties

# 定义 rootCategory 的属性
# 指定 rootCategory 的 log 优先级是 DEBUG, 其 Appenders 有一个, 名字叫 rootAppender
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=DEBUG, TestAppender

# 定义 rootAppender 的属性
# consoleAppender 是指控制台输出
# 布局按照指定的格式, PatternLayout 布局打印的 log 比较好看
# ConversionPattern 的参数含义: 
# %d 输出日志时间点的日期或时间
# %p 优先级
# %m 输出 log 的具体信息
# %n 回车换行
log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n 

# 定义 TestAppender 的属性
# RollingFileAppender 是指输出到回卷文件, 即文件达到某个大小的时候产生一个新的文件
# /tmp/TestAppender.log 输出到指定的 log 文件
# 当日志文件到达 maxFileSize 大小时,将会自动滚动
# maxBackupIndex 指定可以产生的滚动文件的最大数目
log4cpp.appender.TestAppender=RollingFileAppender
log4cpp.appender.TestAppender.fileName=/tmp/TestAppender.log
log4cpp.appender.TestAppender.maxFileSize=200
log4cpp.appender.TestAppender.maxBackupIndex=1
log4cpp.appender.TestAppender.layout=PatternLayout
log4cpp.appender.TestAppender.layout.ConversionPattern=%d [%p] %m%n

编译 log_test.cpp

g++ log_test.cpp -o log_test -I./include -L./lib -llog4cpp -lpthread

把 log4cpp 库文件路径导出一下

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/admin/xxx

运行示例程序,显示正常

./log_test

 

 

ARM交叉工具链配置安装

删除之前的 log4cpp 目录,重新解压一次

新建一个目录用来装编译生成的头文件和库文件

mkdir yyy

cd log4cpp

./configure CC=arm-hisiv600-linux-gcc CXX=arm-hisiv600-linux-g++ --host=arm-hisiv600-linux --prefix=/home/admin/yyy

make

make install

把上面的 log_test.cpp 拷贝到yyy目录,编译 log_test.cpp

arm-hisiv600-linux-g++ log_test.cpp -o log_test -I ./include -L ./lib -llog4cpp -lpthread

把以下文件拷贝到开发板或者使用 nfs 挂载(此处我是使用 nfs 挂载的方式)

    可执行程序 log_test

    配置文件 log4cpp.properties

    库文件 liblog4cpp.so(软链接) + liblog4cpp.so.5(软链接) + liblog4cpp.so.5.0.6(本体)

把 log4cpp 库文件路径导出一下

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/nfsroot

运行示例程序,显示异常

./log_test

估计是字符串拼接的时候出了问题

 

解决办法:

删除之前的 log4cpp 目录,重新解压一次,并清空 yyy 目录

cd log4cpp

echo "ac_cv_func_snprintf=yes" > ./config.cache

./configure CC=arm-hisiv600-linux-gcc CXX=arm-hisiv600-linux-g++ --host=arm-hisiv600-linux --config-cache --prefix=/home/admin/yyy

make

make install

同样方法编译、在开发板运行,正常显示了

 

log4cpp 的用处多多,对程序员开发 简直爱不释手!

另外,如果不想log打印在终端,可以使用dup2丢到空洞文件/dev/null,代码如下:

    int fd = -1;
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1)
    {
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        close(fd);
    }

 

 

在ARM平台,如果是log4c的话,要依赖于expat去解析xml配置文件

下载expat 2.0.1版本

https://sourceforge.net/projects/expat/files/expat/

解压并进到expat-2.0.1目录,执行

./configure CC=arm-hisiv600-linux-gcc --host=arm-hisiv600-linux --prefix=/home/admin/aaa

make

make install

得到expat的头文件和库文件

 

下载log4c 1.2.4版本

https://sourceforge.net/projects/log4c/files/log4c/1.2.4/log4c-1.2.4.tar.gz/download

解压并进到log4c-1.2.4目录,执行

./configure CC=arm-hisiv600-linux-gcc --host=arm-hisiv600-linux CFLAGS=-I/home/admin/aaa/include LDFLAGS=-L/home/admin/aaa/lib --prefix=/home/admin/bbb

./configure CC=arm-hisiv600-linux-gcc --host=arm-hisiv600-linux --with-expat-prefix=/home/admin/aaa --prefix=/home/admin/bbb

make

make install

得到log4c的头文件和库文件,其配置文件可参考:/home/admin/bbb/etc/log4crc.sample,经过改良如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM "">

<log4c>

	<config>
		<bufsize>0</bufsize>
		<debug level="0"/>
		<nocleanup>0</nocleanup>
	</config>

	<!-- root category ========================================= -->
	<category name="root" priority="debug" appender="stdout"/>
	<category name="file" priority="debug" appender="mylog"/>

	<!-- default appenders ===================================== -->
	<appender name="stdout" type="stream" layout="basic"/>
	<appender name="mylog" type="rollingfile" layout="dated" logdir="/var/tmpfs/" prefix="xxx.log" rollingpolicy="RollingPolicy"/>

	<!-- default layouts ======================================= -->
	<layout name="basic" type="basic"/>
	<layout name="dated" type="dated"/>
	
	<rollingpolicy name="RollingPolicy" type="sizewin" maxsize="20000" maxnum="3"/>
</log4c>

 

测试程序

#include <stdio.h>

#include "log4c.h"

int main(void)
{
    int i = 10;
    char *str = "log4c_test";

    log4c_init();
    log4c_load("/usr/local/etc/log4crc.sample");

    log4c_category_t *root = log4c_category_get("root");
    log4c_category_log(root, LOG4C_PRIORITY_DEBUG, "Hello World!");
    log4c_category_log(root, LOG4C_PRIORITY_ERROR, "Hello God! %d %s", i, str);

    log4c_category_t *file = log4c_category_get("file");
    log4c_category_log(file, LOG4C_PRIORITY_DEBUG, "Hello World!");
    log4c_category_log(file, LOG4C_PRIORITY_ERROR, "Hello God! %d %s", i, str);

    log4c_reread();
    log4c_fini();

    return 0;
}

编译

arm-hisiv600-linux-gcc xxx.c -I ./bbb/include -L ./aaa/lib -lexpat -L ./bbb/lib -llog4c

记得把 libexpat.so liblog4c.so 拷贝到板子上

运行

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章