繁体   English   中英

将 static Boost 库与 vcpkg 和 CMake 结合使用

[英]Using static Boost libraries with vcpkg and CMake

我正在使用 package 管理器vcpkg通过vcpkg install boost:x64-windows-static安装(静态) Boost库。

此外,我使用CMake作为构建系统,并通过-DCMAKE_TOOLCHAIN_FILE CMake命令将C:\vcpkg\scripts\buildsystems\vcpkg.cmakeCMake

在我的CMakeLists.txt中,我强制使用 static Boost库:

set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS filesystem iostreams REQUIRED)
if (Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})
endif ()

# ...

target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES})

但是, Visual Studio仍会尝试查看我的Boost库的错误文件路径:

Error 'C:/vcpkg/installed/x64-windows/lib/boost_filesystem-vc140-mt.lib', needed by 'MyProject.exe', missing and no known rule to make it

如果我安装动态Boost库,它会很好地构建,因为这是Visual Studio看起来的地方。 但是,我想在我的构建中使用 static 库,以便所有DLL都“合并”到最终的EXE中。

我怎样才能做到这一点?

我有同样的问题。

解决了

define  set(Boost_INCLUDE_DIR "path")

在 find_package 强制之前。

当您将cmakevcpkg一起vcpkg ,在CmakeCache.txt找到_VCPKG_INSTALLED_DIR变量

set(Boost_INCLUDE_DIR ${_VCPKG_INSTALLED_DIR}/x64-windows-static/include)

似乎默认情况下 vcpkg.cmake 脚本会自动检测由 vcpkg 安装的动态库。

您可以通过在调用 cmake 时设置变量来覆盖项目的此行为:

cmake .. -DCMAKE_TOOLCHAIN_FILE=.../vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static

或者使用 CMakePresets.json:

"cacheVariables": {
 ...
  "CMAKE_TOOLCHAIN_FILE": {
    "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
    "type": "FILEPATH"
  },
  "VCPKG_TARGET_TRIPLET": "x64-windows-static"
},

我还没有找到如何在每个图书馆的基础上做到这一点。

这篇文章中有更多细节。

实际上,我发现可以正常工作的是以下 CMake:

# Boost settings
set(Boost_USE_STATIC_LIBS        ON)  # only find static libs
set(Boost_USE_DEBUG_LIBS        OFF)  # ignore debug libs and
set(Boost_USE_RELEASE_LIBS       ON)  # only find release libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME     ON)  # link Boost Static libraries

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM