Windows 10及Visual Studio 2015下安裝libconfig

2 篇文章 0 订阅

前言

筆者一開始打算在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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值