Windows下用vcpkg+自定义GCC9.2.0编译RocksDB静态库失败
解决Windows下vcpkg配合GCC 9.2.0编译RocksDB的
-auxbase-strip及文件名过多问题 我在为RocksDB开发Kotlin/Native绑定,必须使用GCC/G++ 9.2.0编译RocksDB——高版本GCC会因gettid符号未定义报错(Kotlin/Native依赖glibc 2.15)。Linux和macOS下用Makefile编译正常,但Windows环境通过vcpkg编译时遇到两个核心错误:
cc1plus.exe不识别-auxbase-strip选项- 提示文件名过多
以下是针对性解决方案:
1. 移除不兼容的-auxbase-strip编译选项
-auxbase-strip是较新版本GCC引入的选项,GCC 9.2.0的MinGW版本不支持。需要在CMake配置中移除该参数:
- 在自定义工具链文件中添加:
# 从CXX/C编译Flags中移除-auxbase-strip选项 string(REPLACE "-auxbase-strip" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REPLACE "-auxbase-strip" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") # 禁用链接器插件(该选项可能自动引入-auxbase-strip) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-use-linker-plugin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-use-linker-plugin") - 或者在vcpkg安装时通过cmake参数指定:
vcpkg install rocksdb --triplet=your-custom-triplet --cmake-args="-DCMAKE_CXX_FLAGS=-fno-use-linker-plugin"
2. 解决文件名过多问题
Windows下路径长度限制和vcpkg生成的长参数容易触发这个错误,可通过以下方式缓解:
- 缩短vcpkg安装路径:将vcpkg从默认的长路径(如
C:\Program Files\vcpkg)迁移到短路径(如C:\v) - 启用CMake相对路径:在工具链文件中添加:
set(CMAKE_USE_RELATIVE_PATHS ON) - 放宽路径长度限制:
# 增大对象文件路径长度上限 set(CMAKE_OBJECT_PATH_MAX 2048) - 开启Windows长路径支持:通过注册表或组策略启用系统级长路径支持(适用于Windows 10 1607及以上版本)
3. 修正vcpkg Triplet与工具链配置
确保自定义Triplet和工具链文件正确指向Kotlin/Native自带的GCC 9.2.0:
- 自定义工具链文件示例:
set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER "C:/path/to/kotlin-native/gcc/bin/gcc.exe") set(CMAKE_CXX_COMPILER "C:/path/to/kotlin-native/gcc/bin/g++.exe") set(CMAKE_AR "C:/path/to/kotlin-native/gcc/bin/ar.exe") set(CMAKE_RANLIB "C:/path/to/kotlin-native/gcc/bin/ranlib.exe") # 禁用编译器自动检测,强制使用指定版本 set(CMAKE_C_COMPILER_FORCED TRUE) set(CMAKE_CXX_COMPILER_FORCED TRUE) - 自定义Triplet文件示例:
set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE static) # 加载自定义工具链 include("C:/path/to/your/toolchain.cmake")
4. 额外排查步骤
- 执行vcpkg安装时增加日志verbosity,确认参数来源:
vcpkg install rocksdb --triplet=your-custom-triplet --debug - 禁用vcpkg二进制缓存,避免旧缓存干扰:
vcpkg install rocksdb --triplet=your-custom-triplet --no-binarycaching - 设置环境变量
VCPKG_DISABLE_COMPILER_TRACKING=ON,阻止vcpkg自动替换编译器
内容的提问来源于stack exchange,提问作者aSemy
相关产品推荐
相关产品推荐

