亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++編譯使用log4cplus的詳細(xì)步驟

 更新時(shí)間:2023年10月28日 14:59:54   作者:洛克希德馬丁  
C++很強(qiáng)大,但是仍然有很多不盡如人意的地方,比如打印日志方面就沒(méi)有java的log4j那種信手拈來(lái),自然而然地東西,今天我們說(shuō)一說(shuō)一個(gè)很強(qiáng)大地日志庫(kù)log4cplus在c++項(xiàng)目中地使用,感興趣的朋友一起看看吧

提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考幫助文檔

前言

C++很強(qiáng)大,但是仍然有很多不盡如人意的地方,比如打印日志方面就沒(méi)有java的log4j那種信手拈來(lái),自然而然地東西。目前官方?jīng)]有推出這個(gè)東西,只能借助第三方開(kāi)源項(xiàng)目實(shí)現(xiàn),或者干脆自己實(shí)現(xiàn)。但是,今天我們說(shuō)一說(shuō)一個(gè)很強(qiáng)大地日志庫(kù)log4cplus在c++項(xiàng)目中地使用。

一、log4cplus是什么?

看名字就明白了,為c++開(kāi)發(fā)地日志庫(kù)。接下來(lái)引用開(kāi)發(fā)者的話(huà):

log4cplus is a simple to use C++ logging API providing thread–safe, flexible, and arbitrarily granular control over log management and configuration. It is modeled after the Java log4j API.

二、使用步驟

1.下載源代碼

這個(gè)地方需要注意地是現(xiàn)在master是3.x版本了,這個(gè)版本基于C++ 20以后,使用C++ 11會(huì)直接編譯報(bào)錯(cuò)。如果你是C++ 11的話(huà)請(qǐng)?jiān)诜种Ю镎业?.x的版本(包括2.0.x和2.1.x)。

由于這兩個(gè)版本編譯上沒(méi)有顯著區(qū)別,今天就以2.0.x版本為基礎(chǔ)講一下log4cplus的編譯使用。

log4cplus下載地址

git clone https://gitee.com/anold/log4cplus.git -b 2.0.x

這里克隆完了還不能拿來(lái)直接用,還需要同步下引用的子項(xiàng)目。直接克隆的代碼很小,包括子項(xiàng)目之后的大概是不到60MB,請(qǐng)留一下項(xiàng)目大小。

在這里插入圖片描述

進(jìn)入到項(xiàng)目目錄后執(zhí)行以下命令:

git submodule update --init --recursive

一定要確認(rèn)所有操作成功了才行,否則編譯時(shí)一定失敗。

2.開(kāi)始配置

1.配置介紹

log4cplus配置項(xiàng)眾多,可以根據(jù)需要來(lái)配置。

請(qǐng)注意,不同的版本分支配置項(xiàng)可能不一樣,請(qǐng)注意區(qū)分。這個(gè)東西在配置文件里可以看到,這里不細(xì)說(shuō)了。

Configure script options
--enable-debugging
This option is disabled by default. This option mainly affects GCC builds but it also has some limited effect on non-GCC builds. It turns on debugging information generation, undefines NDEBUG symbol and adds -fstack-check (GCC).
--enable-warnings
This option is enabled by default. It adds platform / compiler dependent warning options to compiler command line.
--enable-so-version
This option is enabled by default. It enables SO version decoration on resulting library file, e.g., the .2.0.0 in liblog4cplus-1.2.so.2.0.0.
--enable-release-version
This option is enabled by default. It enables release version decoration on the resulting library file, e.g., the -1.2 in liblog4cplus-1.2.so.2.0.0.
--enable-symbols-visibility-options
This option is enabled by default. It enables use of compiler and platform specific option for symbols visibility. See also the Visibility page on GCC Wiki.
--enable-profiling
This option is disabled by default. This option adds profiling information generation compiler option -pg to GCC and Sun CC / Solaris Studio builds.
--enable-threads
This option is enabled by default. It turns on detection of necessary compiler and linker flags that enable POSIX threading support.
While this detection usually works well, some platforms still need help with configuration by supplying additional flags to the configure script. One of the know deficiencies is Solaris Studio on Linux. See one of the later note for details.
--with-wchar_t-support
This option is enabled by default. When enabled, additional binaries will be built, marked with U suffix in file name and compiled with -DUNICODE=1 flag. In effect, these binaries assume that log4cplus::tchar is wchar_t.
--with-working-locale
This is one of three locale and wchar_t?char conversion related options. It is disabled by default.
It is know to work well with GCC on Linux. Other platforms generally have lesser locale support in their implementations of the C++ standard library. It is known not to work well on any BSDs.
See also docs/unicode.txt.
--with-working-c-locale
This is second of wchar_t?char conversion related options. It is disabled by default.
It is known to work well on most Unix--like platforms, including recent Cygwin.
--with-iconv
This is third of wchar_t?char conversion related options. It is disabled by default.
The conversion using iconv() function always uses "UTF-8" and "WCHAR_T" as source/target encoding. It is known to work well on platforms with GNU iconv. Different implementations of iconv() might not support "WCHAR_T" encoding selector.
Either system provided iconv() or library provided libiconv() are detected and accepted. Also both SUSv3 and GNU iconv() function signatures are accepted.
--with-qt
This option is disabled by default. It enables compilation of a separate shared library (liblog4cplusqt4debugappender) that implements Qt4DebugAppender. It requires Qt4 and pkg-config to be installed.
--enable-tests
This option is enabled by default. It enables compilation of test executables.
--enable-unit-tests
This option is disabled by default. It enables compilation of unit tests along their units. These unit tests then can be executed through unit_tests test executable that is built during compilation.

主要包括調(diào)試,so版本號(hào)支持,寬字符支持和本地化等。如果看不懂英文就維持原樣。

2.開(kāi)始編譯

編譯方法原作者已經(jīng)給出了,這里著重說(shuō)一下LInux上的編譯。

這里還是建議安裝到/usr/local;一方面,因?yàn)?usr本身包含很多操作系統(tǒng)預(yù)裝的應(yīng)用,相比來(lái)說(shuō)/usr/local基本上空空如也,管理起來(lái)方便。另一方面,也是為了以后使用pkgconfig查找方便,這個(gè)后面再說(shuō)。

./configure --prefix=/usr/local --enable-so-version=yes --enable-release-version=yes \
--enable-threads=yes

配置好之后使用下面的命令:

make -j6 && sudo make install

安裝好之后會(huì)在/usr/local下面找到,重點(diǎn)是/usr/local/lib/pkgconfig/log4cplus.pc,一會(huì)配置要用到這個(gè)文件。

3.cmake引用

這里選用的是cmake,不為了別的就是因?yàn)楹?jiǎn)單。這里需要先通過(guò)cmake找到pkgconf這個(gè)包管理器,再通過(guò)pkgconf進(jìn)一步定位log4cplus這個(gè)最終需要的包。
請(qǐng)看配置:

cmake_minimum_required(VERSION 3.10)
project(log_4_cplus)
set(CMAKE_CXX_STANDARD 11)
find_package(PkgConfig REQUIRED)
if (PKG_CONFIG_FOUND)
	message(STATUS "PkgConfig Found")
	pkg_search_module(
			log4cplus
			REQUIRED
			log4cplus
			IMPORTED_TARGET
	)
	if (TARGET PkgConfig::log4cplus)
		message(STATUS "log4cplus Found")
		add_executable(log_4_cplus main.cpp)
		target_link_libraries(log_4_cplus PkgConfig::log4cplus)
	endif ()
endif ()

重點(diǎn)就是find_package(PkgConfig REQUIRED)pkg_search_module,前者找到Linux上面安裝的pkgconf,后者通過(guò)pkgconf找到它管理的module,也就是log4cplus。

這個(gè)時(shí)候你就可以使用log4cplus了。下面列出幾個(gè)簡(jiǎn)單的例子,其它的用法可以看下開(kāi)發(fā)者的tests或wiki。

4.示例

簡(jiǎn)單實(shí)用1:

#include <iostream>
#include <iomanip>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/initializer.h>
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
void printTest(log4cplus::Logger const &logger) {
    LOG4CPLUS_INFO(logger,
                   LOG4CPLUS_TEXT("This is")
                           << LOG4CPLUS_TEXT(" a reall")
                           << LOG4CPLUS_TEXT("y long message.") << std::endl
                           << LOG4CPLUS_TEXT("Just testing it out") << std::endl
                           << LOG4CPLUS_TEXT("What do you think?"));
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a bool: ") << true);
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a char: ")
            << LOG4CPLUS_TEXT('x'));
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a short: ")
            << static_cast<short>(-100));
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a unsigned short: ")
            << static_cast<unsigned short>(100));
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a int: ") << 1000);
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a unsigned int: ") << 1000U);
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a long(hex): ")
            << std::hex << 100000000L);
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a unsigned long: ")
            << static_cast<unsigned long>(100000000U));
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a float: ") << 1.2345f);
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a double: ")
            << std::setprecision(15)
            << 1.2345234234);
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a long double: ")
            << std::setprecision(15)
            << 123452342342.342L);
}
int main(){
    log4cplus::Initializer initializer;
    log4cplus::BasicConfigurator config;
    config.configure(logger);
    log4cplus::Logger logger = log4cplus::Logger::getInstance(
            LOG4CPLUS_TEXT("main"));
	printTest();
	return 0;
}

簡(jiǎn)單實(shí)用2:

#include <iostream>
#include <iomanip>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/initializer.h>
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
//帶時(shí)間格式的日志
void time_format_test() {
    log4cplus::tchar const fmtstr[] =
            LOG4CPLUS_TEXT("%s, %Q%%q%q %%Q %%q=%%%q%%;%%q, %%Q=%Q");
    std::cout << "Entering main()..." << std::endl;
    log4cplus::Initializer initializer;
    try {
        Time time;
        log4cplus::tstring str;
        time = now();
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << LOG4CPLUS_TEXT ("now: ") << str << std::endl;
        time = time_from_parts(0, 7);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
        time = time_from_parts(0, 17);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
        time = time_from_parts(0, 123);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
        time = time_from_parts(0, 1234);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
        time = time_from_parts(0, 12345);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
        time = time_from_parts(0, 123456);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
        time = time_from_parts(0, 0);
        str = getFormattedTime(fmtstr, time);
        log4cplus::tcout << str << std::endl;
    }
    catch (std::exception const &e) {
        std::cout << "Exception: " << e.what() << std::endl;
    }
    catch (...) {
        std::cout << "Exception..." << std::endl;
    }
    std::cout << "Exiting main()..." << std::endl;
}
int main(){
	time_format_test();
	return 0;
}

總結(jié)

1、蠻簡(jiǎn)單的,倒是log4cplus的使用有很多需要研究的地方

到此這篇關(guān)于c++編譯使用log4cplus的文章就介紹到這了,更多相關(guān)c++編譯使用log4cplus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++模擬實(shí)現(xiàn)STL容器vector的示例代碼

    C++模擬實(shí)現(xiàn)STL容器vector的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++如何模擬實(shí)現(xiàn)STL容器vector的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-11-11
  • VC小技巧匯總之控件技巧

    VC小技巧匯總之控件技巧

    這篇文章主要介紹了VC小技巧匯總之控件技巧,對(duì)于VC的開(kāi)發(fā)很有借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • 關(guān)于Qt?C++中connect的幾種寫(xiě)法代碼示例

    關(guān)于Qt?C++中connect的幾種寫(xiě)法代碼示例

    這篇文章介紹了Qt中connect函數(shù)的不同編寫(xiě)方式,包括傳統(tǒng)的槽函數(shù)寫(xiě)法、使用函數(shù)指針的寫(xiě)法、Lambda表達(dá)式以及使用QOverload選擇重載信號(hào)的寫(xiě)法,每種寫(xiě)法都有其特點(diǎn)和適用場(chǎng)景,程序員應(yīng)根據(jù)具體需求選擇最合適的方式,需要的朋友可以參考下
    2024-11-11
  • C語(yǔ)言簡(jiǎn)明講解歸并排序的應(yīng)用

    C語(yǔ)言簡(jiǎn)明講解歸并排序的應(yīng)用

    這篇文章主要介紹了 c語(yǔ)言排序之歸并排序,歸并就是把兩個(gè)或多個(gè)序列合并,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言如何讀取bmp圖像

    C語(yǔ)言如何讀取bmp圖像

    這篇文章主要介紹了C語(yǔ)言如何讀取bmp圖像,BMP即bitmap,由文件頭信息塊、圖像描述信息塊、顏色表、圖像數(shù)據(jù)區(qū)四部分組成,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼

    C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言制作簡(jiǎn)易金山打字通功能的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 在C語(yǔ)言中比較兩個(gè)字符串是否相等的方法

    在C語(yǔ)言中比較兩個(gè)字符串是否相等的方法

    這篇文章主要介紹了在C語(yǔ)言中比較兩個(gè)字符串是否相等的方法,分別介紹了strcmp()函數(shù)和strcasecmp()函數(shù),注意功能區(qū)分,需要的朋友可以參考下
    2015-08-08
  • wxWidgets實(shí)現(xiàn)圖片和文件按鈕

    wxWidgets實(shí)現(xiàn)圖片和文件按鈕

    這篇文章主要為大家詳細(xì)介紹了wxWidgets實(shí)現(xiàn)圖片和文件按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 詳解C++的模板中typename關(guān)鍵字的用法

    詳解C++的模板中typename關(guān)鍵字的用法

    在C++的Template中我們經(jīng)常可以見(jiàn)到使用typename來(lái)定義類(lèi)型名稱(chēng),更加具體的我們就在接下來(lái)為大家詳解C++的模板中typename關(guān)鍵字的用法,需要的朋友可以參考下:
    2016-06-06
  • VSCode下.json文件的編寫(xiě)之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋

    VSCode下.json文件的編寫(xiě)之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋

    這篇文章主要介紹了VSCode下.json文件的編寫(xiě)之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論