首页 > 系统相关 >Windows + MinGW-W64 Boost程序库 环境配置踩坑指南

Windows + MinGW-W64 Boost程序库 环境配置踩坑指南

时间:2023-12-15 13:47:47浏览次数:34  
标签:Windows boost W64 编译 构建 b2 83 程序库 Boost

Windows + MinGW-W64 Boost程序库 环境配置踩坑指南

本文仅在博客园由aquawius发布,请在转载注明本链接,我这里就不写开源协议了,总之盗文章的马没了就完了。

0x00 关于MinGW-W64的安装

你可以自己选择, 我使用的来自github的w64devkit, 这个工具内置了比较多的小工具,在linux中有许多工具windows用不了,w64devkit里边就有提供(甚至包括vim!!)

添加bin目录到环境变量就可以了.

0x01 关于Boost程序库

Boost.Buildb2.exe

尽量使用带有管理员权限的终端执行命令, 因为似乎boost默认的安装位置在C:\boost?

需要通过源码自带的booststrap.bat工具编译b2.exe工具

其中需要指定编译器为gcc, 如果没有指定gcc工具链, 那么bootstrap.bat默认将会使用Visual Studio的cl编译器.

这里有一个前提, gcc需要在环境变量中, 也就是(0x00步骤).

cd boost_1_83_0
./booststrap.bat gcc

你的目录下将会多出来一个b2.exe, 这个步骤是必须的.

我猜你可能有下面的问题:

./booststrap.bat gcc 说明一下为什么这样做, 为我做了什么?

(ChatGPT回答):

在Boost库中,bootstrap.bat是用来初始化构建系统的脚本,而b2则是Boost构建工具(Boost.Build)的可执行文件。Boost库使用Boost.Build作为其构建系统,用于管理库的编译和安装过程。

bootstrap.bat主要用于生成b2二进制文件,这是Boost.Build的一个组成部分,它将用于后续的编译过程。b2实际上是Boost.Build的主要执行文件,通过运行它,您可以指定构建选项、目标等。

b2 install命令则是使用Boost.Build来进行实际的编译和安装操作.

b2能构建除了boost以外的目标吗, 通常这样做吗

(ChatGPT回答):

b2是Boost库特定的构建工具,主要用于构建和管理Boost库的编译过程。它通过使用Boost.Build系统来实现这些功能。Boost.Build是一个灵活的构建系统,实际上可以用于构建除了Boost库之外的其他项目。

虽然b2和Boost.Build最初是为Boost库设计的,但它们也可以用于其他C++项目的构建。Boost.Build具有可扩展性和通用性,因此某些开发者可能选择在其他项目中使用它。

使用b2和Boost.Build构建非Boost项目的一个常见做法是编写一个自定义的Jamroot文件(类似于Makefile或CMakeLists.txt),其中包含项目的构建规则和依赖关系。然后,可以使用b2命令执行构建。

尽管可以这样做,但在实践中,很多项目更倾向于使用其他构建系统,如CMake、Makefile、或使用IDE(集成开发环境)的内置构建工具。这些工具更为通用,并且在整个C++社区中更广泛使用。

因此,虽然b2和Boost.Build可以用于非Boost项目,但在实际应用中,开发者可能更喜欢使用其他构建工具,特别是在非Boost项目中。

也就是说boost是通过b2读取已经写好的Jamroot进行构建并安装到我的机器上的

(ChatGPT回答):

是的,您的理解基本正确。Boost库通过b2命令和Boost.Build系统进行构建。构建过程通常是通过读取项目根目录下的Jamroot文件(或者在旧版本中是Jamfile)来定义构建规则、依赖关系和其他构建配置。

Jamroot文件是一个文本文件,其中包含了描述构建过程的规则,指定了库的编译选项、源文件列表、依赖关系等。Boost.Build会解析Jamroot文件并根据其中的规则执行构建操作。

在执行构建之前,通常需要运行bootstrap.bat脚本来生成b2二进制文件,它是Boost.Build系统的一部分,负责实际执行构建过程。

最终,通过运行b2 install命令,Boost库将根据Jamroot文件中的规则进行编译,并安装到您指定的目标目录中。

总体而言,b2Jamroot文件是Boost库构建系统的核心组成部分,它们一起协同工作,使得Boost库可以在各种平台上进行自动化的构建和安装。


0x02 Boost的编译安装

boost官网是这样说的, Boost中的部分库有的可以不用编译直接使用, 但是有的必须进行编译才能够使用.

我选择是全部编译, 这样我就不用考虑需不需要编译的问题了.

在编译安装之前我希望你对b2构建工具有更深的印象.

./b2.exe --help
B2 4.10-git
Project-specific help:
  Project has jamfile at Jamroot

Usage:
  b2 [options] [properties] [install|stage]
  Builds and installs Boost.
  
Targets and Related Options:

  install                 Install headers and compiled library files to the
  =======                 configured locations (below).
  
  --prefix=<PREFIX>       Install architecture independent files here.
                          Default: C:\Boost on Windows
                          Default: /usr/local on Unix, Linux, etc.
....................

我这里请GPT老师帮助我翻译.

请你翻译成中文, 对重要的内容进行解释.

(ChatGPT)

这段内容是b2的帮助信息,它列出了b2的用法、目标、相关选项以及其他一些配置。让我为您解释其中的重要内容:

  1. Usage 部分:
    • b2 [options] [properties] [install|stage]: 这是b2的基本用法,它用于构建和安装Boost库。
  2. Targets and Related Options 部分:
    • install: 安装Boost库到配置的位置。
    • --prefix=<PREFIX>: 指定安装的根目录,默认在 Windows 下是 C:\Boost,在 Unix、Linux 下是 /usr/local
    • stage: 仅构建和安装编译好的库文件到临时目录。
  3. Other Options 部分:
    • --build-type=<type>: 构建指定预定义变体的库。默认是minimal,也可以选择complete
    • --build-dir=DIR: 指定构建的位置,推荐使用。
    • --show-libraries: 显示需要构建和安装的Boost库列表。
    • --layout=<layout>: 确定库名称和头文件位置的命名规则。可选值有versionedtaggedsystem
  4. Important Options 部分:
    • --clean: 删除目标而不是构建。
    • -a: 重新构建所有。
    • -n: 仅打印命令而不执行。
    • -d+2: 显示执行命令时的详细信息。
    • -q: 在遇到第一个错误时停止。
    • --reconfigure: 重新运行所有配置检查。
    • --durations[=N]: 报告执行时间最长的前 N 个目标。
    • --debug-configuration: 诊断配置。
    • --debug-building: 报告使用哪些属性构建哪些目标。
    • --debug-generator: 诊断生成器搜索/执行。

这些选项和目标可以帮助您配置和执行Boost库的构建和安装过程。

我们需要按照帮助命令中的要求补充b2的命令就可以了


我这里给出的命令是这样的

.\b2 --prefix="C:\boost" --build-type=complete threading=multi link=shared toolset=gcc install -j8

注意: 我这里指定了toolset=gcc(也就是MinGW-W64)作为编译工具集. -j8指定了使用8个线程进行编译(加快编译速度).

运行之后(我的电脑编译了接近20分钟), 配置不好的电脑可能更慢.

编译之后, --prefix中设定的目录(我这里是C:\boost目录) 如下所示:

C:\boost
.
├── include
│   └── boost-1_83
│    └── boost
│     	├── accumulators
│ 	  	├── accumulators.hpp
│ 	  	├── accumulators_fwd.hpp
│ 	  	├── framework
│ 	  	│   ├── accumulator_base.hpp
│ 	  	│   ├── accumulator_concept.hpp
│ 	  	│   ├── accumulator_set.hpp
│ 	  	│   ├── accumulators
│ 	  	│   │   ├── droppable_accumulator.hpp
│ 	  	│   │   ├── external_accumulator.hpp
│ 	  	│   │   ├── reference_accumulator.hpp
│		................................................... 
└── lib
    ├── cmake
    ├── libboost_atomic-mgw13-mt-d-x32-1_83.a
    ├── libboost_atomic-mgw13-mt-d-x64-1_83.a
    ├── libboost_atomic-mgw13-mt-d-x64-1_83.dll
    ├── libboost_atomic-mgw13-mt-d-x64-1_83.dll.a
    ├── libboost_atomic-mgw13-mt-s-x32-1_83.a
    ├── libboost_atomic-mgw13-mt-s-x64-1_83.a
    ├── libboost_atomic-mgw13-mt-sd-x32-1_83.a
    ├── libboost_atomic-mgw13-mt-sd-x64-1_83.a
    ├── libboost_atomic-mgw13-mt-x32-1_83.a
    ├── libboost_atomic-mgw13-mt-x64-1_83.a
    ├── libboost_atomic-mgw13-mt-x64-1_83.dll
    ├── libboost_atomic-mgw13-mt-x64-1_83.dll.a
		..................................................

0x03 关于使用Boost库

如果你想使用cmake作为构建工具, 我这里有一个调试好的CMakeList.txt.

主要用来编译chapter*/**.cpp中的文件.

cmake_minimum_required(VERSION 3.20)
project(BoostLearning)

if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
    message(STATUS "Windows Detected!")
  	# 如果是 Windows,设置 Boost 根目录
    set(Boost_ROOT "C:/boost")
    message(STATUS "set Boost_ROOT to ${Boost_ROOT}")
endif()

find_package(Boost REQUIRED)
set(Boost_NO_SYSTEM_PATHS ON) # 只搜索上语句设置的搜索路径

if(Boost_FOUND)
    message(STATUS "Boost found!")
    message(STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
endif()

set(Boost_ARCHITECTURE “-x64”)

# 遍历章节目录
file(GLOB CHAPTER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/chapter*")

# 遍历每个章节
foreach(CHAPTER_DIR ${CHAPTER_DIRS})
    # 获取文件夹名称
    get_filename_component(CHAPTER_DIR_LAST_WORD ${CHAPTER_DIR} NAME)

    # 获取章节中的所有CPP文件
    file(GLOB CHAPTER_CPP_FILES "${CHAPTER_DIR}/*.cpp")

    # 遍历每个CPP文件
    foreach(CPP_FILE ${CHAPTER_CPP_FILES})
        # 获取CPP文件名,假设文件名的命名规则为"filename.cpp"
        get_filename_component(FILE_NAME ${CPP_FILE} NAME_WE)

        set(EXECUTABLE_NAME "${FILE_NAME}")

        # 添加可执行文件
        add_executable(${EXECUTABLE_NAME} ${CPP_FILE})

        # 链接Boost库
        target_link_libraries(${EXECUTABLE_NAME} PUBLIC Boost::boost)

        # 设置可执行文件的输出目录为相对路径
        set_target_properties(${EXECUTABLE_NAME} PROPERTIES
                OUTPUT_NAME ${FILE_NAME}
                RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CHAPTER_DIR_LAST_WORD}
        )
    endforeach()
endforeach()

如果你使用的是IDE, 请在include中包含你编译的那些hpp, 在我的例子中是C:\boost\include\boost-1_83, 链接使用的目录为C:\boost\lib, 之后你的IDE环境就能找到对应的头文件, 并且给出代码提示了.

请注意:IDE的include中请不要设置为C:\boost\include\boost-1_83\boost,

因为通常在引入头文件的时候,是#include "boost/xxxxx/xxxx.hpp", 所以请设定为C:\boost\include\boost-1_83(不要后面的boost)

0xFF 后记

没有什么后记...吧, 就是折腾挺长时间的, 可算折腾明白这玩应怎么工作了.

标签:Windows,boost,W64,编译,构建,b2,83,程序库,Boost
From: https://www.cnblogs.com/aquawius/p/17903200.html

相关文章

  • Windows + MinGW-W64 Boost程序库 环境配置踩坑指南
    Windows+MinGW-W64Boost程序库环境配置踩坑指南0x00关于MinGW-W64的安装你可以自己选择,我使用的来自github的w64devkit,这个工具内置了比较多的小工具,在linux中有许多工具windows用不了,w64devkit里边就有提供(甚至包括vim!!)添加bin目录到环境变量就可以了.0x01关于Bo......
  • windows提权
    WindowsPrivilegeEscalation提权前先基本信息收集:系统版本、漏洞补丁、杀软防护、当前权限、系统配置、系统的服务等查看系统进程:tasklist/svc(杀软防护软件检查)系统漏洞提权思路:查看系统补丁信息,若有系统内核漏洞,但没打补丁就可以尝试找exp查找补丁情况#看windows版本v......
  • windows信息收集
    windows基础知识注册表编辑器win+r输入regedit命令hostnamewhoamiipconfig,iconfig/?表示查看帮助手册cls:清除netstat:查看tcp/ip连接net:用于管理网路资源icacls:用于管理权限标识M:修改W:写R:读X:列出文件夹内容F:完全控制RX:读取和执行WX:更改和执行打开控制面板的......
  • windows安全基本概念
    基本概念账户安全账号信息存储(SAM)SAM:securityaccountmanagerSAM对账户的管理是通过安全标识进行的,每个账户的安全标识是唯一的,账户被创建时,安全标识就会产生。SAM文件是windows的一个账户数据库,存储了登录名、密码等信息。该文件是加密存储的,只有system权限可以访问路径:1......
  • 用C++调用Windows.Media.Ocr接口实现图片的OCR识别
    这个接口最开始是给UWP程序用的。C++里需要用C++/WinRT方式调用。默认参数的识别率也不是很高的样子。只支持Win10+。#include<winrt/Windows.Storage.h>#include<winrt/Windows.Storage.Streams.h>#include<winrt/Windows.Graphics.Imaging.h>#include<winrt/Windows.Me......
  • Windows用户、组
    查看所有账户netuser查看某个账户信息netuser用户名查看某个用户的sidwhoami/user查看所有用户的sidwmicuseraccountgetname,sid查看当前操作系统存在的用户界面操作此电脑→鼠标右击→管理→计算机管理→系统工具→本地用户和组→用户命令操作......
  • python虚拟环境(windows)
    venv虚拟环境,是Python用来创建和管理虚拟环境的模块,该模块供你用来存放你的各种python第三方模块,模块里的环境和本机是完全分开的,也就是说你在venv下通过pip安装的python第三方模块是不会影响到你本机的环境的。具体操作如下:1.先安装virtualenvpipinstallvirtualenv 2.进......
  • Windows上的c/c++编译工具
    Windows上的编译工具有很多种,以下是一些常见的选择:VisualStudio:这是微软开发的一款IDE,支持多种编程语言,包括C++。它提供了丰富的功能,如代码编译、调试、版本控制等。VisualStudio还包含一些强大的工具,如代码智能感知和代码重构工具,可以帮助开发人员提高开发效率。   有......
  • windows安装配置lua
    直接exe安装方式:1.在github下载exehttps://github.com/rjpcomputing/luaforwindows/releases/ 2.直接安装 3.使用命令行 lua.exe终端可以进入,也可以直接cmd输入lua进入参考:https://cloud.tencent.com/developer/article/21686484.使用脚本创建脚本: 运行:  ......
  • linux下,需要删除windows中^M
    linux下,如果需要在vim中查看^M,需要使用如下命令:在Vim的命令模式中输入:e++ff=unix%有时候,我们在Linux中打开曾在Win中编辑过的文件时,会在行尾看到^M字符。虽然,这并不影响什么,但心里面还是有点不痛快。如果想要删除这些^M字符,可以使用Vim来轻松搞定它。在Vi......