精华内容
下载资源
问答
  • 配置文件很重要,INI 太弱,XML 太繁复,Linux *.conf 很酷。 找了好几种相关的类库,发觉还是 hyperrealm libconfig 最强大最好用,相关细节可...c++程序 所需头文件libconfig.h++,编译时需要链接动态库libconfig++
  • libconfig

    2019-11-02 22:49:42
    libconfig.h++> #include <iostream> using namespace std; void write_test() { libconfig::Config cfg; //1.声明 Config对象 auto& root = cfg.getRoot(); root.add("name", lib...
    #include <libconfig.h++>
    #include <iostream>
    
    using namespace std;
    
    void write_test()
    {
      libconfig::Config cfg; //1.声明 Config对象  
      auto& root = cfg.getRoot();
      root.add("name", libconfig::Setting::TypeString);
      root.add("age", libconfig::Setting::TypeInt);
      root.add("address", libconfig::Setting::TypeString);
      root.add("weight", libconfig::Setting::TypeFloat);
      root.add("id", libconfig::Setting::TypeString);
      root["name"] = "jack";
      root["age"] = 22;
      root["address"] = "china";
      root["weight"] = 68.5;
      root["id"] = "kk123";
      cfg.writeFile("example.cfg");
    }
    
    void read_test()
    {
      libconfig::Config cfg; //1.声明 Config对象  
      cfg.readFile("example.cfg");
      auto& root = cfg.getRoot();
      //set default value
      string name = "no name";
      int age = 22;
      double weight = 55.0;
    
      root.lookupValue("name", name);
      root.lookupValue("age", age);
      root.lookupValue("weight1", weight);
    
      cout << name << endl;
      cout << age << endl;
      cout << weight << endl;
    }
    
    int main()
    {
      write_test();
      read_test();
      return 0;
    }
    

     

    展开全文
  • libconfig中文手册.pdf

    2021-09-30 17:48:25
    libconfig中文手册.pdf
  • libconfig-1.4.10.tar.gz

    2018-01-25 11:00:26
    libconfig – C/C++ Configuration File Library If you find this software useful, please consider making a donation in the amount of your choice. At the very least, such donations can go toward paying ...
  • libconfig-1.5.tar.gz

    2019-08-30 16:30:12
    libconfig ndk 交叉编译,移植到Android平台,ndk版本是r17c
  • libconfig-1.7.2.tar.gz

    2018-10-06 10:22:43
    libconfig-1.7.2.tar.gz
  • linux下libconfig的使用

    2021-06-02 10:52:59
    一、libconfig是什么? Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg . 它比xml可读性更好,而且更简洁。而且不像xml,它是type-aware类型自我感知的,因此不需要做string parsing ...

    一、libconfig是什么?

         Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg . 它比xml可读性更好,而且更简洁;Libconfig确实是非常优秀的C/C++配置库,我们程序员完全可以从解析字符串的“苦力”中解脱出来,多复杂的配置项,都能满足。

    二、libconfig交叉编译

    https://blog.csdn.net/u012478275/article/details/117462298

    三、libconfig说明

        libconfig支持结构化、层次化的配置。这些配置可以从文件中读取或写入文件,也可以在内存中操作。

    1、配置类型

    一个配置由一组setting构成,setting由名字(name)关联,并有相应的值(value)。一个值(value)可以是以下任意一种类型:

    标量值(scalarvalue):整型、64位整型、浮点数、布尔值或者字符串

    数组(array):一组标量值的序列,所有的标量值必须为同一类型

    群组(group):多个setting的集合

    列表(list):一组值(value)的序列,各个值可(value)以分别为不同的类型,其他的列表也可以包含其中。
     

    2、数据类型

    整数(int):可以用10进制和16进制表示。0x打头的数字libconfig会自动解析为16进制的数字。

    64位整数(int64_t):在数字的后面加上L即可。

    浮点数(float):个人不太喜欢用这个类型。

    布尔数(bool):true或者false。不区分大小写。

    字符串(string):这个字符串非常强大。

     

    3、数组结构

        和平常我们使用的数组是一样一样的,数组的各个元素都必须是相同的数据类型。

     

    4、群组结构

        这个可以理解为一个容器。这个容器里面,我们可以放置很多个配置项。当然这些配置项的value也可以继续是群组。

     

    5、列表结构

        这个列表和我们C++常用的STL里的list结构可不太一样。这个列表结构里面的元素不要求具备相同的数据类型,元素1是int,元素2可以是string,元素3可以是数组,元素4可以是一个群组,元素5可以是另一个列表。

        可以说,正是因为value的多姿多彩,才给了我们程序员无限的发挥空间。通过群组结构和列表结构,我们可以很方便灵活的进行各种变态的配置读取。除了读取配置,可不要忘记了libconfig还有两只手的哦:必要的时候,我们可以把内存里面的一些值,通过libconfig生成一份标准的配置文件。

    四、libconfig实例和使用

    1、libconfig配置文件example.conf

    /* 这个叫Settings */
    version = "1.0.0.0";
     
    /* 这个叫Groups */
    log = {
      log_path = "../logs/sys.log";  /* 日志文件路径 */
      log_size = 1024000000L;        /* 日志文件大小 */
      log_level = 20000;             /* 日志等级 */
    };
     
    /* 这个叫Lists */
    // 业务服务器列表
    server = (
      {
        addr = "10.1.88.1";
        port = 9090;
      },
      {
        addr = "10.1.88.2";
        port = 9090;
      },
      {
        addr = "10.1.88.3";
        port = 9090;
      }
    );
     
    // 测试配置
    test = {
      // 这个是数组结构。
      uin = [10086L, 10087L, 10088L, 10089L];  /* 测试号码 */
      /* 测试服务器 */
      server = {
        addr = "10.1.99.1";
        port = 9090;
      };
    };

    2、编写程序解析example.conf

    #include <iostream>
    #include <iomanip>
    #include <cstdlib>
    #include <libconfig.h++>
     
    using namespace std;
    using namespace libconfig;
     
    /* g++ -o demo demo.cpp -I/home/leoox/local/libconfig-1.4.9/include/ /home/leoox/local/libconfig-1.4.9/lib/libconfig++.a */
    int main(int argc, char** argv)
    {
      Config cfg;
     
      /*
        解析配置文件。
      */
      try
      {
        cfg.readFile("example.conf");
      }
      catch(const FileIOException &fioex)
      {
        std::cerr << "I/O error while reading file." << std::endl;
        return(EXIT_FAILURE);
      }
      catch(const ParseException &pex)
      {
        std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
                  << " - " << pex.getError() << std::endl;
        return(EXIT_FAILURE);
      }
     
      /* 从配置文件中,得到version这个配置项的值。 */
      try
      {
        string version = cfg.lookup("version");
        cout << "version: " << version << endl << endl;
      }
      catch(const SettingNotFoundException &nfex)
      {
        cerr << "No 'version' setting in configuration file." << endl;
      }
     
      /* 从配置文件中,得到日志相关配置值 */
      try
      {
        string log_path = cfg.lookup("log.log_path");
        cout << "log_path: " << log_path << endl;
     
        int64_t log_size = cfg.lookup("log.log_size");
        cout << "log_size: " << log_size << endl;
     
        int log_level = cfg.lookup("log.log_level");
        cout << "log_level: " << log_level << endl << endl;
      }
      catch(const SettingNotFoundException &nfex)
      {
        cerr << "log setting mistake in configuration file." << endl;
      }
     
      try
      {
        const Setting &server = cfg.lookup("server");
        int count = server.getLength();
        cout << "server.count = " << count << endl;
     
        for (int i = 0; i < count; i++)
        {
          string addr = "";
          int port = 0;
          if (!server[i].lookupValue("addr", addr)
              || !server[i].lookupValue("port", port))
          {
            cerr << "lookupValue error" << endl;
            continue;
          }
     
          cout << "server[" << i << "] = " << addr << ":" << port << endl;
        }
     
        {
          string addr = "";
          int port = 0;
          if (!cfg.lookupValue("server.[0].addr", addr)
              || !cfg.lookupValue("server.[0].port", port)) {
            cerr << "lookupValue 'server.[0].addr' error" << endl;
          }
          else
            cout << "server[0] = " << addr << ":" << port << endl << endl;
        }
      }
      catch(const SettingNotFoundException &nfex)
      {
        cerr << "server setting mistake in configuration file." << endl;
      }
     
      try
      {
        const Setting& root = cfg.getRoot();
        const Setting &uin = root["test"]["uin"];
        int count = uin.getLength();
        cout << "uin.count = " << count << endl;
     
        const Setting &test = cfg.lookup("test");
        const Setting &test2 = cfg.lookup("test.uin");
        for (int i = 0 ; i < count; i++)
        {
          int64_t u = test["uin"][i];
          int64_t uu = uin[i];
          int64_t uuu = test2[i];
          cout << "uin[" << i << "] = " << u << ", " << uu << ", " << uuu << endl;
        }
     
        const Setting &server = root["test"]["server"];
        string addr = "";
        int port = 0;
        if (!server.lookupValue("addr", addr)
            || !server.lookupValue("port", port))
        {
          cerr << "test server lookupValue error" << endl;
        }
        else
          cout << "test server = " << addr << ":" << port << endl << endl;
      }
      catch(const SettingNotFoundException &nfex)
      {
        cerr << "test setting mistake in configuration file." << endl;
      }
     
      return 0;
    }

    3、编译运行

    [leoox@Thrift config]$ g++ -o demo demo.cpp -I/home/leoox/local/libconfig-1.4.9
    /include/home/leoox/local/libconfig-1.4.9/lib/libconfig++.a
    [leoox@Thrift config]$ ./demo
    version: 1.0.0.0
     
    log_path: ../logs/sys.log
    log_size: 1024000000
    log_level: 20000
     
    server.count = 3
    server[0] = 10.1.88.1:9090
    server[1] = 10.1.88.2:9090
    server[2] = 10.1.88.3:9090
    server[0] = 10.1.88.1:9090
     
    uin.count = 4
    uin[0] = 10086, 10086, 10086
    uin[1] = 10087, 10087, 10087
    uin[2] = 10088, 10088, 10088
    uin[3] = 10089, 10089, 10089
    test server = 10.1.99.1:9090

     

    展开全文
  • 一、libconfig是什么 Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg. 它比xml可读性更好,而且更简洁。而且不像xml,它是type-aware类型自我感知的,因此不需要做string parsing 。 ...

    一、libconfig是什么

            Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg . 它比xml可读性更好,而且更简洁。而且不像xml,它是 type-aware类型自我感知的,因此不需要做string parsing 。        

            Libconfig 是用于读取、操作和写入结构化配置文件的库。 该库具有完全可重入的解析器,并包括 C 和 C++ 编程语言的绑定。该库可在现代 POSIX 兼容系统上运行,例如 Linux、Solaris 和 Mac OS X (Darwin),以及 Microsoft Windows 2000/XP 及更高版本(使用 Microsoft Visual Studio 2005 或更高版本,或 GNU 工具链通过 MinGW 环境)。

    二、libconfig的解析方式    

            一个配置由一组setting构成,setting由名字(name)关联,并有相应的值(value)。一个值(value)可以是以下任意一种类型:

            标量值(scalarvalue):整型、64位整型、浮点数、布尔值或者字符串

            数组(array):一组标量值的序列,所有的标量值必须为同一类型

            群组(group):多个setting的集合

            列表(list):一组值(value)的序列,各个值可(value)以分别为不同的类型,其他的列表也可以包含其中。

            包含在配置中的某个setting可以用path来唯一定义,path用点号分隔连接多个名字(name),由最顶层的群组(group)开始,到setting自身结束。path中的每个名字都是一个setting的名字;如果这个setting没有名字,那是因为它是数组(array)或列表(list)中的一个元素。用方括号包含一个整型索引值可以用来表示它的名字。

            值的数据类型由值本身的格式确定。如果值用双引号括起来,则将其视为字符串。如果它看起来像一个整数或浮点数,则按原样处理。如果它是值 TRUE、true、FALSE 或 false(或这些标记的任何其他大小写混合版本,例如 True 或 FaLsE)之一,则将其视为布尔值。如果它由括在方括号中的逗号分隔值列表组成,则将其视为数组。如果它由括在括号中的逗号分隔值列表组成,则将其视为列表。任何不满足这些条件的值都被视为无效并导致解析错误。所有名称都区分大小写。它们只能由字母数字字符、破折号 (‘-’)、下划线 (‘_’) 和星号 (‘*’) 组成,并且必须以字母或星号开头。不允许使用其他字符。

            在 C 和 C++ 中,整数、64 位整数、浮点数和字符串值分别映射到本机类型 int、long long、double 和 const char *。 boolean 类型在 C 中映射为 int,在 C++ 中映射为 bool。以下部分更详细地描述了配置文件语法的元素:

    • setting

    一个setting的格式如下:

    name= value;或者name: value;结尾的分号是必须要有的,空白字符会被忽略;value可以是标量值、数组、群组或者列表。

    • 群组(group)

    一个群组的格式如下:{setting1,setting2, …},一个群组可以包含任意个setting,但是在群组中,每个setting的名字必须是唯一的。

    • 数组(array)

    一个数组的格式如下:[value,value, …],一个数组可以有零个或者多个元素,但是每个元素都必须是相同类型的标量值。

    • 列表(list)

    一个列表的格式如下:(value,value, …),一个列表可以有零个或者多个元素,而且每个元素可以分别是标量值、数组、群组或其他列表。

    • 整型值

    整型值(int)可以用两种方式表示:十进制数,由0-9组成,并且可以带+或-;十六进制数,0x打头并且用十六进制数表示。

    • 64位整型值

    64位整型值(longlong)表示方法和整型值基本一致,但是需要在最后加上L来表明它是一个64位整型值。比如0L表示一个64位的0值。

    • 浮点值

    浮点值由一个十进制数,可以带正负符号,然后带上一个可选的指数。这个可选的指数又由字母E或者e加上一个可选的正负符号再加上具体的数字。

    • 布尔值

    布尔值的取值只能是true和false,包括另外大小写混合的写法,比如tRue或FaLSe。

    • 字符串

    字符串是由双引号引起来的任意文本。字符串里的双引号由转义符\”替代,其他的转义符比如\\、\f、\r、\n、\t都可以被辨认,并且与通常的理解一致。

    另外,转义符\x也被支持。它后面必须跟上刚好两个十六进制数,用来表示8位的ASCII值,比如\xFF表示值为0xFF的ASCII码。

    其他的转义符都不被支持。

    相邻的两个字符串会被自动连接,就像C的编码规则一样。在把一个很长得字符串格式化为很短的字符串的时候,就会很有用。比如,下面三种写法的字符串都是等价的。

    "Thequickbrownfoxjumpedoverthelazydog."

    "Thequickbrownfox"

    "jumpedoverthelazydog."

    "Thequick"/*注释*/"brownfox"//其他注释

    "jumpedoverthelazydog."

    • 注释

    在配置文件中允许三种类型的注释

    脚本风格的注释:从#开始到行尾的内容都为注释。

    C风格的注释:/*和*/之间的内容,即使是跨行的,都被认为是注释。

    C++风格的注释:从//开始到行尾的内容都被认为是注释。

    如预料的一样,注释符在双引号字符串中出现,会被认为是字符串的文本而不是注释符。

    在读取配置的时候,注释内容会被忽略,它们不会被认为是配置的一部分。因此,如果配置回写到文件中,原配置文件中的一些注释会丢失。

    • 包含指令

    一个配置文件可能包含了另外一个配置文件的内容,这时就要用到包含指令。这个指令产生的效果就是在包含点内联了那个文件的内容。

    一个包含指令必须出现在它所在的那一行中,格式如下:

    @include“filename”

    文件名中反斜杠和双引号必须用转义符\\和\”来替代。

    举例说明,观察下面两个配置文件

    #file:quote.cfg

    quote="Criticismmaynotbeagreeable,butitisnecessary."

    "Itfulfilsthesamefunctionaspaininthehuman"

    "body.Itcallsattentiontoanunhealthystateof"

    "things.\n"

    "\t--WinstonChurchill";

    #file:test.cfg

    info:{

    name="WinstonChurchill";

    @include"quote.cfg"

    country="UK";

    };

    包含文件最大只能嵌套10层,突破这个限制会产生一个分析错误。

    与注释类似,包含指令也不是配置文件句法的一部分。包含指令在配置文件被分析之前就已经被处理了。因此,当配置回写回文件的时候,包含指令不会被保留。目前还不支持让程序把包含指令插入到配置文件中。

    三、使用libconfig注意事项

    1. C++API 头文件 #include <libconfig.h++> ,命名空间:using namespace libconfig;

    2.多线程使用问题:

      (1)libconfig是完全可重入的,库中函数不使用全局变量和不保持成功调用间的状态。所以两个独立配置文件在两个不同线程间并发操作可以是安全的;

      (2)libconfig是线程不安全,libconfig不考虑系统线程模型。所以一个配置文件的实例被多个线程获取,必须使用同步机制(例如读写锁或互斥锁)来保护。

      (3)libconfig不是异步安全,不能在信号句柄中调用

      (4)libconfig不能保证取消安全。因为它不知道主机系统的线程模型,库不包含任何线程取消点。在大多数情况下这将不是多线程程序的问题。但是,请注意一些库中的例程(即那些从/到文件读取/写入配置的程序)流)使用可能会阻止的C库例程执行I/O;是否这些C库例程是取消安全的,取决于主机系统。

    3.C++API

      C++API使用Config类和Setting类,因为不提供公有的copy constructor or assignment operator,所以在函数参数中传递时使用引用或指针方式

    四、libconfig常用API

            1、Method on Config: void readFile (const char * filename)

    readFile() 方法从名为 “filename” 的文件中读取并解析配置。 如果发生解析错误,则抛出 ParseException。 如果无法读取文件,则抛出 FileIOException。

            2、Method on Config: void writeFile (const char * filename)

    writeFile() 方法将配置写入名为 “filename” 的文件。 如果无法写入文件,则会引发 FileIOException。

            3、Method on Config: Setting & lookup (const std::string &path)

                 Method on Config: Setting & lookup (const char * path)

    这两个方法定位由路径指定的Setting。 如果未找到请求的Setting,则抛出 SettingNotFoundException。返回值为Setting对应的value。

            4、Method on Config: Setting & getRoot ()

    此方法返回Setting的根设置,是一个Group。

            5、Method on Config: bool lookupValue (const char *path, bool &value)

                  Method on Config: bool lookupValue (const std::string &path, bool &value)

                  Method on Config: bool lookupValue (const char *path, int &value)

                  Method on Config: bool lookupValue (const std::string &path, int &value)

                  Method on Config: bool lookupValue (const char *path, unsigned int &value)

                  Method on Config: bool lookupValue (const std::string &path, unsigned int &value)

                  Method on Config: bool lookupValue (const char *path, long long &value)

                  Method on Config: bool lookupValue (const std::string &path, long long &value)

                  Method on Config: bool lookupValue (const char *path, float &value)

                  Method on Config: bool lookupValue (const std::string &path, float &value)

                  Method on Config: bool lookupValue (const char *path, double &value)

                  Method on Config: bool lookupValue (const std::string &path, double &value)

                  Method on Config: bool lookupValue (const char *path, const char *&value)

                  Method on Config: bool lookupValue (const std::string &path, const char *&value)

                  Method on Config: bool lookupValue (const char *path, std::string &value)

                  Method on Config: bool lookupValue (const std::string &path, std::string &value)

    这些方法是使用给定path查找Setting值的便捷方法。 如果找到该Setting并且是适当的类型,则将该值存储在 value 中并且该方法返回 true。 否则, value 保持不变并且该方法返回 false。 这些方法不会抛出异常。

    五、Linux下 C/C++ libconfig安装及配置

            libconfig下载地址:https://hyperrealm.github.io/libconfig/

            1、解压并安装:

    1. tar xzvf libconfig-1.7.2.tar.gz

    2. cd libconfig-1.7.2

    3. sudo ./configure

    4. sudo make

    5. sudo make check

    6. sudo make install

             2、配置环境变量,libconfig默认安装在/usr/local/lib下,将此路径添加到path中

    export LD_LIBRARY_PATH=/usr/local/lib   //配置环境变量

    sudo ldconfig -V                                          //查看是否安装

             3、测试

            1)测试C版本

    1. cd examples/c/

    2. gcc example1.c -o example1 -lconfig

    3. ./example1

             2)测试C++版本

    1. cd examples/c++/

    2. g++ example1.cpp -lconfig++ -o example1

    3. ./example1 

    展开全文
  • 筆者一開始打算在Windows 10下安裝官方的libconfig,並搭配Visual Studio 2015使用。但是因為官方的教程在這方面並沒有太多著墨,筆者自己踩了坑後(詳見Unable to compile on Windows 10),決定轉而使用vcpkg來安裝...

    前言

    筆者一開始打算在Windows 10下安裝官方的libconfig,並搭配Visual Studio 2015使用。但是因為官方的教程在這方面並沒有太多著墨,筆者自己踩了坑後(詳見Unable to compile on Windows 10),決定轉而使用vcpkg來安裝。

    安裝vcpkg

    vcpkg是由微軟開發,用於在Windows, Mac及Linux下管理C/C++套件的工具。

    vcpkg的安裝十分簡單,其步驟都寫在官方的Readme裡了。

    官方建議的安裝路徑為C:\src\vcpkgC:\dev\vcpkg,在此筆者選擇的是C:\src\vcpkg

    首先到C:\src(要自己創建這個目錄):

    cd C:\src
    

    然後下載vcpkg

    git clone https://github.com/microsoft/vcpkg
    

    接著進入該專案,執行bootstrap-vcpkg.bat

    cd vcpkg
    bootstrap-vcpkg.bat
    

    安裝完成後試著下vcpkg這個指令,如果成功的話會打印出一連串的help message。

    安裝libconfig

    要用vcpkg安裝套件也很簡單,只要在vcpkg install後面加上套件名稱即可:

    vcpkg install libconfig
    

    如上,但是有一點要注意的是,它默認安裝的版本是在x86系統上使用的libconfig:x86-windows,如果想要在x64系統上使用,則應使用以下指令:

    vcpkg install libconfig:x64-windows
    

    在Visual Studio 2015中使用

    設定Properties

    Solution Explorer中,先點選要配置的專案,然後選取Properties
    Properties
    左側選取VC++ Directories,然後配置相關路徑。
    Executable Directories中加上C:\src\vcpkg\installed\x64-windows\bin
    Include Directories中加上C:\src\vcpkg\installed\x64-windows\include
    Library Directories中加上C:\src\vcpkg\installed\x64-windows\lib
    VC++ Directories
    接著選取左側Linker->General,在Additional Library Directories處加上C:\src\vcpkg\installed\x64-windows\lib
    linker general
    然後點選Linker->Input,在Additional Dependencies處加上libconfig++.lib
    linker input

    使用property sheet

    上一節是在Visual Studio的GUI裡添加相關路徑,這裡採用另外一種方式,即使用property sheet設置。

    新增一份名為libconfig.props的檔案,填入以下內容。

    <?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ImportGroup Label="PropertySheets" />
      <!-- User Macros -->
      <PropertyGroup Label="UserMacros">
        <LIBCONFIG_ROOT Condition="'$(Platform)'=='Win32'">C:\src\vcpkg\installed\x86-windows</LIBCONFIG_ROOT>
        <LIBCONFIG_ROOT Condition="'$(Platform)'=='x64'">C:\src\vcpkg\installed\x64-windows</LIBCONFIG_ROOT>
      </PropertyGroup>
      <!-- Release|x64 -->
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
      </PropertyGroup>
      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
        <ClCompile>
          <AdditionalIncludeDirectories>$(LIBCONFIG_ROOT)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
          <SDLCheck>false</SDLCheck>
        </ClCompile>
        <Link>
          <AdditionalLibraryDirectories>$(LIBCONFIG_ROOT)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
          <AdditionalDependencies Condition="'$(PlatformToolset)'=='v142'">libconfig++.lib;%(AdditionalDependencies)</AdditionalDependencies>
        </Link>
      </ItemDefinitionGroup>
      <ItemGroup />
    </Project>
    

    然後在Visual Studio右上角的小視窗中,切換到Property Manager頁面:
    property manager
    Release | x64上右鍵,選擇Add Existing Property Sheet...,將剛剛建立的libconfig.props加入即可。

    dll檔

    在link時會需要用到libconfig.dlllibconfig++.dll這兩個檔案,要把它們從C:\src\vcpkg\installed\x64-windows\bin複製到<Visual_Studio_Project_Directory>\x64\Release下面。

    (後來發現不必做這一步libconfig.dlllibconfig++.dll也會自動被複製到該目錄底下?)

    至此libconfig已經配置完成,可以來跑跑看簡單的範例程式了。

    範例程式

    以下是一個簡單的C++範例程式,用於從config.txt中讀取鍵值對。

    其中要注意的是,對於C++,應該include libconfig.h++;如果是用C語言,則應include libconfig.h

    #include <iostream>
    #include <iomanip>
    #include <libconfig.h++>
    
    int main(int argc, char** argv) {
    	libconfig::Config cfg;
    	cfg.readFile("config.txt");
    	std::cout << "==============================" << std::endl;
    	std::cout << "configs: " << std::endl;
    	const libconfig::Setting& root = cfg.getRoot();
    	for (libconfig::SettingConstIterator it = root.begin(); it != root.end(); ++it) {
    		switch (it->getType()) {
    		case libconfig::Setting::TypeInt: {
    			int val = root.lookup(it->getName());
    			std::cout << std::setw(25) << it->getName() << std::setw(20) << " (TypeInt) : " << val << std::endl;
    			break;
    		}
    		case libconfig::Setting::TypeInt64: {
    			long long val = root.lookup(it->getName());
    			std::cout << std::setw(25) << it->getName() << std::setw(20) << " (TypeInt64) : " << val << std::endl;
    			break;
    		}
    		case libconfig::Setting::TypeFloat: {
    			float val = root.lookup(it->getName());
    			std::cout << std::setw(25) << it->getName() << std::setw(20) << " (TypeFloat) : " << val << std::endl;
    			break;
    		}
    		case libconfig::Setting::TypeString: {
    			std::string val = root.lookup(it->getName());
    			std::cout << std::setw(25) << it->getName() << std::setw(20) << " (TypeString) : " << val << std::endl;
    			break;
    		}
    		case libconfig::Setting::TypeBoolean: {
    			bool val = root.lookup(it->getName());
    			std::cout << std::setw(25) << it->getName() << std::setw(20) << " (TypeBoolean) : " << (val ? "true" : "false") << std::endl;
    			break;
    		}
    		case libconfig::Setting::TypeGroup:
    		case libconfig::Setting::TypeArray:
    		case libconfig::Setting::TypeList:
    			std::cout << std::setw(25) << it->getName() << " (TypeGroup, TypeArray or TypeList)" << std::endl;
    			break;
    		default:
    			std::cout << std::setw(25) << it->getName() << " (None)" << std::endl;
    		}
    	}
    }
    

    以下是config.txt

    mybool = true;
    myint = 123;
    myfloat = 3.14;
    mystring = "abc";
    

    其執行結果為:

    ==============================
    configs:
                       mybool    (TypeBoolean) : true
                        myint        (TypeInt) : 123
                      myfloat      (TypeFloat) : 3.14
                     mystring     (TypeString) : abc
    ==============================
    

    參考連結

    LNK2019: Unresolved external symbol __declspec(dllimport)

    Unable to compile on Windows 10

    DLL project

    展开全文
  • linux下libconfig的移植

    2021-06-02 10:34:39
    一、前言 Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg. 它比xml可读性更好,而且更简洁
  • libconfig—使用指南

    千次阅读 2018-09-19 09:50:16
    1 libconfig是什么? Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg . 它比xml可读性更好,而且更简洁。而且不像xml,它是&nbsp;type-aware类型自我感知的,因此不需要做string ...
  • libconfig c语言实例

    2019-06-05 21:24:07
    在工作项目中,使用到了配置文件导入导出等功能(否则程序就不是可配置的),所以就需要合理选择配置文件得读写操作,libconfig就是这么样一个东西。 Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,...
  • libconfig-开源

    2021-07-03 00:45:16
    libconfig 是一个可移植且灵活的 C++ 配置文件解析器,它是 KDE KConfig 类的 ISO C++ 端口。 它具有与 KDE 库中的 KConfig 几乎相同的功能。在 Linux 和 Win32(msvc、mingw32 或 Cygwin)下都可以正常工作。
  • libconfig LIST操作

    2020-08-04 17:11:39
    libconfig LIST操作 添加LIST的keyword config_setting_t *slist = NULL; config_setting_t *stmp= NULL; slist = config_setting_add(setting, "keyword", CONFIG_TYPE_LIST) 指定LIST成员的类型 stmp = ...
  • 1.libconfig官网下载路径 https://hyperrealm.github.io/libconfig/ 2.安装libconfig 安装过程:解压,配置,编译,安装 //解压安装包 tar -zxvf libconfig-1.7.2.tar.gz //安装前的引导配置,默认安装到/usr/local...
  • libconfig 版本:libconfig-1.5.tar.gz ndk下载地址: https://developer.android.google.cn/ndk/downloads?hl=zh-cn 版本:android-ndk-r19c-linux-x86_64.zip #!/bin/sh # Compiles libconfig for Android #NDK...
  • 最近项目中遇到的配置文件升级功能(需要保留原始配置),在网上没有找到比较合适的例子,所以自己便写了一个,代码比较简单,使用的是libconfig编写的。只为提供一个简单的例子,所以里面只有一层配置,不保证效率只...
  • ubuntu下安装libconfig++

    千次阅读 2020-06-17 21:51:23
    关于 #include "libconfig.h++"出错,找不到libconfig.h++文件。 尝试安装: centos: yum install libconfig libconfig-devel ubuntu: sudo apt-get install libconfig libconfig++-dev libconfig-dev -y ...
  • Linux C 开发 配置文件读写库 Libconfig

    千次阅读 2019-05-17 10:26:04
    一:什么是Libconfig? 程序开发过程中往往很多参数需要放在配置文件中,因为这样可以避免更改代码重新编译的问题。通常我们可以通过自己读init文件来实现,不过已经有很多人做了这方面的东西,可以借用,Libconfig...
  • 1. 下载libconfig 网址 点击跳转下载:https://hyperrealm.github.io/libconfig/ 如果是在windows上下载的,想要传到linux服务器上,使用xftp传输软件,将该文件传输,具体步骤就不在此赘述了,请看我的xftp安装与...
  • libconfig安装及配置文件简单示例

    千次阅读 2019-04-23 15:46:01
    libconfig下载地址 2.安装 安装包:libconfig-1.7.2.tar.gz 安装过程:解压,配置,编译,安装 //解压安装包 tar -zxvf libconfig-1.7.2.tar.gz //安装前的引导配置,默认安装到/usr/local,可以通过./...
  • libconfig++示例详解

    万次阅读 2017-02-18 20:13:43
    libconfig++是一个用于处理结构化配置文件的简单库。libconfig++的配置的文件格式非常简洁,可读性也非常的好,而且是type-aware,普通的配置文件读取后存取的类型为字符串,libconfig++可以“识别”整形的配置。...
  •  现在相信大家对libconfig已经有一定了解了,如果你想了解更多可以查看官网,如果你想知道到底怎么使用可以下载libConfig,里面有很多example。谢谢! 转载于:https://www.cnblogs.com/liboBlog/p/6123699.html
  • libconfig读取配置文件

    千次阅读 2019-03-04 21:09:12
    #include <libconfig.h> #define CONFIG_FILE "libconfigdemo.cfg" int main(void) { //the type of config config_t cfg, *cf; const config_setting_t *retries;//the setting of config const char *base =...
  • Linux libconfig配置文件库读取

    千次阅读 2018-03-25 10:30:29
    1 libconfig是什么? Libconfig是一个结构化的配置文件库,它可以定义一些配置文件,例如test.cfg . 它比xml可读性更好,而且更简洁。而且不像xml,它是 type-aware类型自我感知的,因此不需要做string parsing ...
  • centos安装libconfig

    2019-06-23 19:49:55
    安装很简单,生成的.so文件会被安装到/usr/local/lib目录,记得修改/etc/profile。 安装过程会出现两个错误: What is makeinfo, and how do I get it? v.1.6.tar.gz compilation error on centos7 ...
  • libconfig 例子

    2018-09-19 09:52:20
    两个例子均来自libconfig包的example文件夹下面,. 例子一: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #include &lt;libconfig.h++&gt; using...
  • libConfig++-开源

    2021-07-04 09:52:24
    libConfig++ 是一个可移植且灵活的 C++ 库,用于读取以 C 风格语法编写的配置文件。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 856
精华内容 342
关键字:

libconfig