c++ 将静态Boost库与vcpkg和CMake配合使用

fivyi3re  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(449)

我使用包管理器vcpkg通过vcpkg install boost:x64-windows-static安装(静态)Boost库。
此外,我使用CMake作为构建系统,并通过-DCMAKE_TOOLCHAIN_FILECMake命令将C:\vcpkg\scripts\buildsystems\vcpkg.cmake传递给CMake
在我的CMakeLists.txt中,我强制使用静态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的外观。然而,我想在我的构建中使用静态库,以便所有DLL都"合并"到最终的EXE中。
我怎样才能做到这一点?

sy5wg1nm

sy5wg1nm1#

我也有同样的问题。
解决方法

define  set(Boost_INCLUDE_DIR "path")

在强制执行find_package之前。
cmakevcpkg配合使用时,请在CmakeCache.txt中查找_VCPKG_INSTALLED_DIR变量

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

5kgi1eie2#

默认情况下,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"
},

我还没有找到如何在每个库的基础上进行此操作。
更多详细信息herehere

8xiog9wr

8xiog9wr3#

实际上,我发现正确工作的是以下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

相关问题