使用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
相关产品推荐
相关产品推荐

