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

Windows(MSYS2)下用vcpkg链接Google Benchmark时出现未定义引用

Windows下g++链接Google Benchmark静态库的未定义引用问题解决

问题原因

链接错误中的__imp__前缀说明编译器在尝试解析动态库导入符号,但你通过vcpkg安装的是x64-mingw-static静态库,核心矛盾点:

  • Google Benchmark在Windows环境下默认启用动态库模式(定义BENCHMARK_USE_DLL宏),导致代码生成依赖动态库的符号引用
  • 编译命令未明确指定使用静态库版本,也未补充静态库所需的依赖系统库

解决方案

1. 强制启用静态库模式

编译时添加-DBENCHMARK_STATIC_DEFINE宏,告诉Google Benchmark头文件生成静态库兼容的符号引用,避免生成动态库导入表。

2. 修正编译链接命令

调整链接库的顺序(依赖库在前,被依赖库在后),并补充Google Benchmark静态库依赖的系统库shlwapi:

g++ -std=c++23 -DBENCHMARK_STATIC_DEFINE test_benchmark.cpp -isystem "C:\Program Files\vcpkg\installed\x64-mingw-static\include" -L "C:\Program Files\vcpkg\installed\x64-mingw-static\lib" -lbenchmark_main -lbenchmark -lpthread -lshlwapi -o benchmark_test.exe

注意:-lbenchmark_main必须放在-lbenchmark之前,因为benchmark_main库依赖benchmark核心库,链接器按命令行顺序解析依赖。

3. 验证库的ABI兼容性

确保vcpkg安装的benchmark使用的是与当前MSYS2 g++匹配的工具链编译,可重新安装指定主机三元组:

vcpkg install benchmark:x64-mingw-static --host-triplet=x64-mingw-static

4. 简化编译(可选)

通过vcpkg集成工具自动配置环境,再用pkg-config自动获取编译参数(需先在MSYS2中安装pkg-config包):

# 先执行vcpkg集成
vcpkg integrate install
# 再编译
g++ -std=c++23 -DBENCHMARK_STATIC_DEFINE test_benchmark.cpp $(pkg-config --cflags --libs benchmark benchmark_main) -lpthread -lshlwapi -o benchmark_test.exe

测试代码

#include <benchmark/benchmark.h>

static void BM_StringCreation(benchmark::State& state) {
    for (auto _ : state)
        std::string empty_string;
}
BENCHMARK(BM_StringCreation);

static void BM_StringCopy(benchmark::State& state) {
    std::string x = "hello";
    for (auto _ : state)
        std::string copy(x);
}
BENCHMARK(BM_StringCopy);

BENCHMARK_MAIN();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:44:54