You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VCPKG构建Abseil for MSVC17失败,寻求技术支持

解决VCPKG构建Abseil(MSVC17)时的GTest::gmock目标缺失问题

问题现象

使用VCPKG为MSVC17构建Abseil(作为OpenCV依赖)时,CMake配置阶段失败,核心错误为无法找到GTest::gmock目标,导致test_allocator链接接口无效。

错误日志

CMake Error at CMake/AbseilHelpers.cmake:317 (target_link_libraries):
目标"test_allocator"的链接接口包含:
GTest::gmock
但未找到该目标。可能的原因包括:
* 目标名称存在拼写错误。
* 缺少针对IMPORTED目标的find_package调用。
* 缺少ALIAS目标。
调用栈(最新调用在前):
absl/container/CMakeLists.txt:206 (absl_cc_library)

CMake警告:
手动指定的变量未被项目使用:
FETCHCONTENT_FULLY_DISCONNECTED
_VCPKG_ROOT_DIR
CMake生成步骤失败,无法正确重新生成构建文件。

现有port文件内容

if (NOT VCPKG_TARGET_IS_WINDOWS)
    vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
endif()

vcpkg_from_github(
    OUT_SOURCE_PATH SOURCE_PATH
    REPO abseil/abseil-cpp
    REF "${VERSION}"
    SHA512 5062e731ee8c9a757e6d75fc1c558652deb4dd1daab4d6143f7ad52a139501c61365f89acbf82480be0f9a4911a58286560068d8b1a8b6774e6afad51739766e
    HEAD_REF master
    PATCHES
        0001-revert-integer-to-string-conversion-optimizations.patch # Fix openvino MSVC compile error
)

vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS
    FEATURES
        cxx17 ABSL_USE_CXX17
)

# With ABSL_PROPAGATE_CXX_STD=ON abseil automatically detect if it is being
# compiled with C++14 or C++17, and modifies the installed `absl/base/options.h`
# header accordingly. This works even if CMAKE_CXX_STANDARD is not set. Abseil
# uses the compiler default behavior to update `absl/base/options.h` as needed.
if (ABSL_USE_CXX17)
    set(ABSL_USE_CXX17_OPTION "-DCMAKE_CXX_STANDARD=17")
endif ()

vcpkg_cmake_configure(
    SOURCE_PATH "${SOURCE_PATH}"
    DISABLE_PARALLEL_CONFIGURE
    OPTIONS
        -DABSL_PROPAGATE_CXX_STD=ON
        ${ABSL_USE_CXX17_OPTION}
)

vcpkg_cmake_install()
vcpkg_cmake_config_fixup(PACKAGE_NAME absl CONFIG_PATH lib/cmake/absl)
vcpkg_fixup_pkgconfig()

vcpkg_copy_pdbs()
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share"
                    "${CURRENT_PACKAGES_DIR}/debug/include"
                    "${CURRENT_PACKAGES_DIR}/include/absl/copts"
                    "${CURRENT_PACKAGES_DIR}/include/absl/strings/testdata"
                    "${CURRENT_PACKAGES_DIR}/include/absl/time/internal/cctz/testdata"
)

if (VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
    file(GLOB_RECURSE headers "${CURRENT_PACKAGES_DIR}/include/absl/*.h")
    foreach(header IN LISTS ${headers})
        vcpkg_replace_string("${header}"
            "!defined(ABSL_CONSUME_DLL)" "0"
        )
        vcpkg_replace_string("${header}"
            "defined(ABSL_CONSUME_DLL)" "1"
        )
    endforeach()
endif()

vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")

解决步骤

1. 禁用测试构建(推荐)

Abseil的测试组件依赖GTest,而构建OpenCV依赖时通常无需测试代码。修改port文件中的vcpkg_cmake_configure部分,添加禁用测试的选项:

vcpkg_cmake_configure(
    SOURCE_PATH "${SOURCE_PATH}"
    DISABLE_PARALLEL_CONFIGURE
    OPTIONS
        -DABSL_PROPAGATE_CXX_STD=ON
        ${ABSL_USE_CXX17_OPTION}
        -DBUILD_TESTING=OFF  # 新增:跳过测试目标构建
)

2. 手动引入GTest依赖(如需测试)

如果确实需要构建Abseil的测试代码,在port文件开头添加GTest依赖声明:

vcpkg_add_dependencies(gtest)

同时在vcpkg_cmake_configure中添加-DFETCHCONTENT_FULLY_DISCONNECTED=OFF,消除原警告并启用依赖拉取。

3. 清理缓存后重新构建

执行以下命令清理VCPKG缓存并重新安装Abseil:

vcpkg remove abseil --recurse
vcpkg clean
vcpkg install abseil:x64-windows

内容的提问来源于stack exchange,提问作者Rajanand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:02:09