当前位置: 首页 > news >正文

C++ Boost 自动链接机制详解

Boost 提供了一个非常方便的特性——自动链接(Auto-Linking)机制,可以简化链接过程,避免手动指定链接器参数的繁琐。

一、什么是自动链接?

自动链接是 Boost 在 Windows 平台下(尤其是使用 Visual Studio 编译器时)提供的一种链接机制。它通过预处理器宏和编译器指令,让编译器自动选择需要链接的 Boost 库,从而省去手动添加 .lib

例如,当你使用 boost::filesystem 时,不需要手动告诉链接器要链接 libboost_filesystem-vc143-mt-x64-1_85.lib 这样的文件,Boost 会根据你的编译环境自动完成这个任务。

官方介绍 automatic_library_selection

二、自动链接是如何工作的?

Boost 使用了 Microsoft Visual C++ 编译器的一个特性:#pragma comment(lib, "library_name")。这个指令会在编译时告诉链接器需要链接哪些库。

具体来说, <boost\config\auto_link.hpp>头文件中定义了一系列宏,用于确定当前编译环境(如编译器版本、构建配置 Debug/Release、是否使用多线程等),然后根据这些信息构造出正确的库名称,并通过 #pragma comment(lib, ...) 指令通知链接器。

#include <boost/config/auto_link.hpp>
//  (C) Copyright John Maddock 2003.
//  Use, modification and distribution are subject to the
//  Boost Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)/**   LOCATION:    see http://www.boost.org for most recent version.*   FILE         auto_link.hpp*   VERSION      see <boost/version.hpp>*   DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers.*//*************************************************************************USAGE:
~~~~~~Before including this header you must define one or more of define the following macros:BOOST_LIB_NAME:           Required: A string containing the basename of the library,for example boost_regex.
BOOST_LIB_TOOLSET:        Optional: the base name of the toolset.
BOOST_DYN_LINK:           Optional: when set link to dll rather than static library.
BOOST_LIB_DIAGNOSTIC:     Optional: when set the header will print out the nameof the library selected (useful for debugging).
BOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib,rather than a mangled-name version.
BOOST_AUTO_LINK_TAGGED:   Specifies that we link to libraries built with the --layout=tagged option.This is essentially the same as the default name-mangled version, but withoutthe compiler name and version, or the Boost version.  Just the build options.
BOOST_AUTO_LINK_SYSTEM:   Specifies that we link to libraries built with the --layout=system option.This is essentially the same as the non-name-mangled version, but withthe prefix to differentiate static and dll buildsThese macros will be undef'ed at the end of the header, further this header
has no include guards - so be sure to include it only once from your library!Algorithm:
~~~~~~~~~~Libraries for Borland and Microsoft compilers are automatically
selected here, the name of the lib is selected according to the following
formula:BOOST_LIB_PREFIX+ BOOST_LIB_NAME+ "_"+ BOOST_LIB_TOOLSET+ BOOST_LIB_THREAD_OPT+ BOOST_LIB_RT_OPT+ BOOST_LIB_ARCH_AND_MODEL_OPT"-"+ BOOST_LIB_VERSION+ BOOST_LIB_SUFFIXThese are defined as:BOOST_LIB_PREFIX:     "lib" for static libraries otherwise "".BOOST_LIB_NAME:       The base name of the lib ( for example boost_regex).BOOST_LIB_TOOLSET:    The compiler toolset name (vc6, vc7, bcb5 etc).BOOST_LIB_THREAD_OPT: "-mt" for multithread builds, otherwise nothing.BOOST_LIB_RT_OPT:     A suffix that indicates the runtime library used,contains one or more of the following letters aftera hyphen:s      static runtime (dynamic if not present).g      debug/diagnostic runtime (release if not present).y      Python debug/diagnostic runtime (release if not present).d      debug build (release if not present).p      STLport build.n      STLport build without its IOStreams.BOOST_LIB_ARCH_AND_MODEL_OPT: The architecture and address model(-x32 or -x64 for x86/32 and x86/64 respectively)BOOST_LIB_VERSION:    The Boost version, in the form x_y, for Boost version x.y.BOOST_LIB_SUFFIX:     Static/import libraries extension (".lib", ".a") for the compiler.***************************************************************************/#ifdef __cplusplus
#  ifndef BOOST_CONFIG_HPP
#     include <boost/config.hpp>
#  endif
#elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__)
//
// C language compatability (no, honestly)
//
#  define BOOST_MSVC _MSC_VER
#  define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)
#  define BOOST_DO_STRINGIZE(X) #X
#endif
//
// Only include what follows for known and supported compilers:
//
#if defined(BOOST_MSVC) \|| defined(BOOST_EMBTC_WINDOWS) \|| defined(BOOST_BORLANDC) \|| (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \|| (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) \|| (defined(BOOST_CLANG) && defined(BOOST_WINDOWS) && defined(_MSC_VER) && (__clang_major__ >= 4))#ifndef BOOST_VERSION_HPP
#  include <boost/version.hpp>
#endif#ifndef BOOST_LIB_NAME
#  error "Macro BOOST_LIB_NAME not set (internal error)"
#endif//
// error check:
//
#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG)
#  pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors")
#  pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes")
#  error "Incompatible build options"
#endif
//
// select toolset if not defined already:
//
#ifndef BOOST_LIB_TOOLSET
#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1200)// Note: no compilers before 1200 are supported
#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1300)#    ifdef UNDER_CE// eVC4:
#      define BOOST_LIB_TOOLSET "evc4"
#    else// vc6:
#      define BOOST_LIB_TOOLSET "vc6"
#    endif#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1310)// vc7:
#    define BOOST_LIB_TOOLSET "vc7"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1400)// vc71:
#    define BOOST_LIB_TOOLSET "vc71"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1500)// vc80:
#    define BOOST_LIB_TOOLSET "vc80"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1600)// vc90:
#    define BOOST_LIB_TOOLSET "vc90"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1700)// vc10:
#    define BOOST_LIB_TOOLSET "vc100"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1800)// vc11:
#    define BOOST_LIB_TOOLSET "vc110"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1900)// vc12:
#    define BOOST_LIB_TOOLSET "vc120"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1910)// vc14:
#    define BOOST_LIB_TOOLSET "vc140"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1920)// vc14.1:
#    define BOOST_LIB_TOOLSET "vc141"#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1930)// vc14.2:
#    define BOOST_LIB_TOOLSET "vc142"#  elif defined(BOOST_MSVC)// vc14.3:
#    define BOOST_LIB_TOOLSET "vc143"#  elif defined(BOOST_EMBTC_WINDOWS)// Embarcadero Clang based compilers:
#    define BOOST_LIB_TOOLSET "embtc"#  elif defined(BOOST_BORLANDC)// CBuilder 6:
#    define BOOST_LIB_TOOLSET "bcb"#  elif defined(__ICL)// Intel C++, no version number:
#    define BOOST_LIB_TOOLSET "iw"#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF )// Metrowerks CodeWarrior 8.x
#    define BOOST_LIB_TOOLSET "cw8"#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF )// Metrowerks CodeWarrior 9.x
#    define BOOST_LIB_TOOLSET "cw9"#  elif defined(BOOST_CLANG) && defined(BOOST_WINDOWS) && defined(_MSC_VER) && (__clang_major__ >= 4)// Clang on Windows
#    define BOOST_LIB_TOOLSET "clangw" BOOST_STRINGIZE(__clang_major__)#  endif
#endif // BOOST_LIB_TOOLSET//
// select thread opt:
//
#if defined(_MT) || defined(__MT__)
#  define BOOST_LIB_THREAD_OPT "-mt"
#else
#  define BOOST_LIB_THREAD_OPT
#endif#if defined(_MSC_VER) || defined(__MWERKS__)#  ifdef _DLL#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-gydp"
#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
#            define BOOST_LIB_RT_OPT "-gdp"
#        elif defined(_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-gydp"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        elif defined(_DEBUG)
#            define BOOST_LIB_RT_OPT "-gdp"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        else
#            define BOOST_LIB_RT_OPT "-p"
#        endif#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-gydpn"
#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
#            define BOOST_LIB_RT_OPT "-gdpn"
#        elif defined(_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-gydpn"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        elif defined(_DEBUG)
#            define BOOST_LIB_RT_OPT "-gdpn"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        else
#            define BOOST_LIB_RT_OPT "-pn"
#        endif#     else#        if defined(_DEBUG) && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-gyd"
#        elif defined(_DEBUG)
#            define BOOST_LIB_RT_OPT "-gd"
#        else
#            define BOOST_LIB_RT_OPT
#        endif#     endif#  else#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-sgydp"
#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
#            define BOOST_LIB_RT_OPT "-sgdp"
#        elif defined(_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#             define BOOST_LIB_RT_OPT "-sgydp"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        elif defined(_DEBUG)
#             define BOOST_LIB_RT_OPT "-sgdp"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        else
#            define BOOST_LIB_RT_OPT "-sp"
#        endif#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#            define BOOST_LIB_RT_OPT "-sgydpn"
#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))
#            define BOOST_LIB_RT_OPT "-sgdpn"
#        elif defined(_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#             define BOOST_LIB_RT_OPT "-sgydpn"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        elif defined(_DEBUG)
#             define BOOST_LIB_RT_OPT "-sgdpn"
#            pragma message("warning: STLport debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        else
#            define BOOST_LIB_RT_OPT "-spn"
#        endif#     else#        if defined(_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#             define BOOST_LIB_RT_OPT "-sgyd"
#        elif defined(_DEBUG)
#             define BOOST_LIB_RT_OPT "-sgd"
#        else
#            define BOOST_LIB_RT_OPT "-s"
#        endif#     endif#  endif#elif defined(BOOST_EMBTC_WINDOWS)#  ifdef _RTLDLL#     if defined(_DEBUG)
#         define BOOST_LIB_RT_OPT "-d"
#     else
#         define BOOST_LIB_RT_OPT
#     endif#  else#     if defined(_DEBUG)
#         define BOOST_LIB_RT_OPT "-sd"
#     else
#         define BOOST_LIB_RT_OPT "-s"
#     endif#  endif#elif defined(BOOST_BORLANDC)//
// figure out whether we want the debug builds or not:
//
#if BOOST_BORLANDC > 0x561
#pragma defineonoption BOOST_BORLAND_DEBUG -v
#endif
//
// sanity check:
//
#if defined(__STL_DEBUG) || defined(_STLP_DEBUG)
#error "Pre-built versions of the Boost libraries are not provided in STLport-debug form"
#endif#  ifdef _RTLDLL#     if defined(BOOST_BORLAND_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#         define BOOST_LIB_RT_OPT "-yd"
#     elif defined(BOOST_BORLAND_DEBUG)
#         define BOOST_LIB_RT_OPT "-d"
#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#         define BOOST_LIB_RT_OPT "-y"
#     else
#         define BOOST_LIB_RT_OPT
#     endif#  else#     if defined(BOOST_BORLAND_DEBUG)\&& defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#         define BOOST_LIB_RT_OPT "-syd"
#     elif defined(BOOST_BORLAND_DEBUG)
#         define BOOST_LIB_RT_OPT "-sd"
#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)
#         define BOOST_LIB_RT_OPT "-sy"
#     else
#         define BOOST_LIB_RT_OPT "-s"
#     endif#  endif#endif//
// BOOST_LIB_ARCH_AND_MODEL_OPT
//#if defined( _M_IX86 )
#  define BOOST_LIB_ARCH_AND_MODEL_OPT "-x32"
#elif defined( _M_X64 )
#  define BOOST_LIB_ARCH_AND_MODEL_OPT "-x64"
#elif defined( _M_ARM )
#  define BOOST_LIB_ARCH_AND_MODEL_OPT "-a32"
#elif defined( _M_ARM64 )
#  define BOOST_LIB_ARCH_AND_MODEL_OPT "-a64"
#endif//
// select linkage opt:
//
#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
#  define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#  error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#  define BOOST_LIB_PREFIX "lib"
#endif//
// now include the lib:
//
#if defined(BOOST_LIB_NAME) \&& defined(BOOST_LIB_PREFIX) \&& defined(BOOST_LIB_TOOLSET) \&& defined(BOOST_LIB_THREAD_OPT) \&& defined(BOOST_LIB_RT_OPT) \&& defined(BOOST_LIB_ARCH_AND_MODEL_OPT) \&& defined(BOOST_LIB_VERSION)#if defined(BOOST_EMBTC_WIN64)
#  define BOOST_LIB_SUFFIX ".a"
#else
#  define BOOST_LIB_SUFFIX ".lib"
#endif#ifdef BOOST_AUTO_LINK_NOMANGLE
#  pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)
#  endif
#elif defined(BOOST_AUTO_LINK_TAGGED)
#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT BOOST_LIB_SUFFIX)
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT BOOST_LIB_SUFFIX)
#  endif
#elif defined(BOOST_AUTO_LINK_SYSTEM)
#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_SUFFIX)
#  endif
#elif defined(BOOST_LIB_BUILDID)
#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) BOOST_LIB_SUFFIX)
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION "-" BOOST_STRINGIZE(BOOST_LIB_BUILDID) BOOST_LIB_SUFFIX)
#  endif
#else
#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION BOOST_LIB_SUFFIX)
#  ifdef BOOST_LIB_DIAGNOSTIC
#     pragma message ("Linking to lib file: " BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT BOOST_LIB_ARCH_AND_MODEL_OPT "-" BOOST_LIB_VERSION BOOST_LIB_SUFFIX)
#  endif
#endif#else
#  error "some required macros where not defined (internal logic error)."
#endif#endif // _MSC_VER || __BORLANDC__//
// finally undef any macros we may have set:
//
#ifdef BOOST_LIB_PREFIX
#  undef BOOST_LIB_PREFIX
#endif
#if defined(BOOST_LIB_NAME)
#  undef BOOST_LIB_NAME
#endif
// Don't undef this one: it can be set by the user and should be the 
// same for all libraries:
//#if defined(BOOST_LIB_TOOLSET)
//#  undef BOOST_LIB_TOOLSET
//#endif
#if defined(BOOST_LIB_THREAD_OPT)
#  undef BOOST_LIB_THREAD_OPT
#endif
#if defined(BOOST_LIB_RT_OPT)
#  undef BOOST_LIB_RT_OPT
#endif
#if defined(BOOST_LIB_ARCH_AND_MODEL_OPT)
#  undef BOOST_LIB_ARCH_AND_MODEL_OPT
#endif
#if defined(BOOST_LIB_LINK_OPT)
#  undef BOOST_LIB_LINK_OPT
#endif
#if defined(BOOST_LIB_DEBUG_OPT)
#  undef BOOST_LIB_DEBUG_OPT
#endif
#if defined(BOOST_DYN_LINK)
#  undef BOOST_DYN_LINK
#endif
#if defined(BOOST_LIB_SUFFIX)
#  undef BOOST_LIB_SUFFIX
#endif

三、控制自动链接行为的宏

Boost 提供了一些预定义宏来控制自动链接的行为:

含义
BOOST_ALL_NO_LIB禁用所有 Boost 库的自动链接
BOOST_ALL_DYN_LINK强制所有 Boost 库动态链接
BOOST_<LIBRARY>_NO_LIB禁用特定库的自动链接(如 BOOST_FILESYSTEM_NO_LIB
BOOST_<LIBRARY>_DYN_LINK强制特定库动态链接

注:<LIBRARY> 替换为实际库名,如 FILESYSTEM, THREAD, SYSTEM 等。

示例:禁用 Boost.Filesystem 的自动链接

#define BOOST_FILESYSTEM_NO_LIB
#include <boost/filesystem.hpp>

此时你需要手动链接 boost_filesystem 库。


四、何时使用自动链接?

✅ 推荐使用自动链接的情况:

  • 使用 Visual Studio 编译器(MSVC)
  • 不希望手动管理 Boost 库路径和链接顺序
  • 快速原型开发或小型项目

❌ 不建议使用自动链接的情况:

  • 跨平台项目(非 Windows 平台不支持自动链接)
  • 需要精确控制链接行为
  • 使用 MinGW、Clang、GCC 等非 MSVC 编译器
  • 构建大型工程,需要统一管理依赖关系

五、非 MSVC 编译器下的替代方案

如果你使用的是 GCC、Clang 或 MinGW,Boost 的自动链接机制不会生效。此时你必须手动指定链接库。例如:

g++ main.cpp -o app -lboost_filesystem -lboost_system

或者在 CMake 中:

target_link_libraries(app PRIVATE boost_filesystem boost_system)
http://www.dtcms.com/a/276339.html

相关文章:

  • Java基础:泛型
  • 单调栈单调队列【算法进阶】
  • 11. JVM中的分代回收
  • 数据结构自学Day6 栈与队列
  • BaseDao 通用查询方法设计与实现
  • 快速过一遍Python基础语法
  • 015---全面理解交易:区块链状态转移的原子单位与链上执行全流程图解
  • 【AI News | 20250711】每日AI进展
  • APP Inventor使用指南
  • LeetCode 3169.无需开会的工作日:排序+一次遍历——不需要正难则反,因为正着根本不难
  • 【使用Pyqt designer时pyside2安装失败】
  • 如何彻底禁用 Chrome 自动更新
  • C++实现二叉树左右子树交换算法
  • vuecil3+版本下,兼容ie等不支持es6的低版本浏览器
  • 内容总监的效率革命:用Premiere Pro AI,实现视频画幅“一键重构”
  • 四、深度学习——CNN
  • 快速上手UniApp(适用于有Vue3基础的)
  • 服务器ssh连接防护指南
  • 软件测试基础1-软件测试需求分析
  • Python技巧记录
  • 详细理解向量叉积
  • CVPR2025 Mamba系列
  • 内容总结I
  • 我的LeetCode刷题笔记——树(2)
  • 带货视频评论洞察 Baseline 学习笔记 (Datawhale Al夏令营)
  • [动态规划]1900. 最佳运动员的比拼回合
  • Matplotlib 模块入门
  • 非欧几里得空间图卷积算子设计:突破几何限制的图神经网络新范式
  • Linux系统中部署Redis详解
  • python作业2