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端口来实现同样的效果,但两种方式都失败:
- 直接修改
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" )
- 给
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组件。
修复步骤
修改
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" } } }调整
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" )确认安装逻辑兼容
确保portfile.cmake中使用vcpkg_cmake_install(),vcpkg会自动根据组件分类复制文件。如果有自定义的安装步骤,需要对应调整,保证shared库和相关文件能被正确安装到installed目录的对应位置。
验证方式
执行vcpkg install gflags[shared]:x64-windows完成安装后,检查installed/x64-windows/share/gflags目录下的配置文件,确认存在shared组件的声明,之后在项目中指定工具链文件即可正常使用。
内容的提问来源于stack exchange,提问作者David Martinez

