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

VCPKG端口覆盖设置变量不生效,无法构建带shared组件的gflags

问题:Vcpkg构建带Shared组件的gflags失败

我通过vcpkg install gflags能正常安装gflags,但需要带shared组件的版本。在项目中指定vcpkg工具链文件-DCMAKE_TOOLCHAIN_FILE=D:\MTC_source_code\vcpkg\scripts\buildsystems\vcpkg.cmake运行CMake时,出现错误:

CMake Error at D:/src/vcpkg/installed/x64-windows/share/gflags/gflags-config.cmake:40 (message):
Package gflags was installed without required component shared!

手动从源码构建shared版本是成功的,步骤如下:

git clone https://github.com/gflags/gflags.git
cd gflags
mkdir _build
cd _build 
cmake .. -G "NMake Makefiles" -DGFLAGS_BUILD_SHARED_LIBS="ON" -DBUILD_SHARED_LIBS="ON"
nmake
nmake install/local

我尝试修改gflags的vcpkg端口来实现同样的效果,但两种方式都失败:

  1. 直接修改portfile.cmake添加编译选项:
vcpkg_cmake_configure(
    SOURCE_PATH "${SOURCE_PATH}"
    OPTIONS
        -DGFLAGS_REGISTER_BUILD_DIR:BOOL=OFF
        -DGFLAGS_REGISTER_INSTALL_PREFIX:BOOL=OFF
        -DBUILD_gflags_nothreads_LIB:BOOL=ON
        -DGFLAGS_USE_TARGET_NAMESPACE:BOOL=ON
        -DCMAKE_DEBUG_POSTFIX=d
        -DGFLAGS_BUILD_SHARED_LIBS="ON" 
        -DBUILD_SHARED_LIBS="ON"
)
  1. 给CMakeLists.txt打补丁并在portfile.cmake中应用:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 53e77cb..17faeb4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -93,7 +93,8 @@ set (PACKAGE_TARNAME     "${PACKAGE_NAME}-${PACKAGE_VERSION}")
 set (PACKAGE_BUGREPORT   "https://github.com/gflags/gflags/issues")
 set (PACKAGE_DESCRIPTION "A commandline flags library that allows for distributed flags.")
 set (PACKAGE_URL         "http://gflags.github.io/gflags")
-
+set (GFLAGS_BUILD_SHARED_LIBS "ON")
+set (BUILD_SHARED_LIBS "ON")
 project (${PACKAGE_NAME} VERSION ${PACKAGE_VERSION} LANGUAGES CXX)
 if (CMAKE_VERSION VERSION_LESS 3.4)
   # C language still needed because the following required CMake modules

两种方式都报相同的错误,但直接在vcpkg的gflags源码目录(vcpkg\buildtrees\gflags\src\v2.2.2-d9283b9285)手动构建却能成功,只有通过vcpkg构建时失败。请问哪里遗漏了?


解决方案

核心原因

gflags的默认vcpkg端口没有声明shared组件,也没有配置对应的安装逻辑。即使你强制开启了编译shared库的选项,vcpkg在安装阶段不会把shared库、头文件和config文件复制到installed目录,导致项目CMake找不到shared组件。

修复步骤

  1. 修改vcpkg.json添加shared组件声明
    在gflags端口的vcpkg.json中加入shared特征,让vcpkg识别这个组件:

    {
      "name": "gflags",
      "version": "2.2.2",
      "description": "A commandline flags library that allows for distributed flags.",
      "features": {
        "shared": {
          "description": "Build shared libraries",
          "supports": "!uwp"
        }
      }
    }
    
  2. 调整portfile.cmake的编译选项逻辑
    不要强制开启shared编译,而是通过vcpkg的特征开关来控制,保证只有在安装gflags[shared]时才编译shared库:

    vcpkg_cmake_configure(
        SOURCE_PATH "${SOURCE_PATH}"
        OPTIONS
            -DGFLAGS_REGISTER_BUILD_DIR:BOOL=OFF
            -DGFLAGS_REGISTER_INSTALL_PREFIX:BOOL=OFF
            -DBUILD_gflags_nothreads_LIB:BOOL=ON
            -DGFLAGS_USE_TARGET_NAMESPACE:BOOL=ON
            -DCMAKE_DEBUG_POSTFIX=d
        OPTIONS_FEATURES
            "shared;GFLAGS_BUILD_SHARED_LIBS=ON"
            "shared;BUILD_SHARED_LIBS=ON"
    )
    
  3. 确认安装逻辑兼容
    确保portfile.cmake中使用vcpkg_cmake_install(),vcpkg会自动根据组件分类复制文件。如果有自定义的安装步骤,需要对应调整,保证shared库和相关文件能被正确安装到installed目录的对应位置。

验证方式

执行vcpkg install gflags[shared]:x64-windows完成安装后,检查installed/x64-windows/share/gflags目录下的配置文件,确认存在shared组件的声明,之后在项目中指定工具链文件即可正常使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:23:23