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

集成Google Test时链接主库与测试可执行文件遇LNK1104错误

解决Windows下MSVC构建时LNK1104找不到静态库的问题

我之前在跨平台配置CMake+Google Test时也踩过几乎一模一样的坑——Linux下跑顺得很,一到Windows用MSVC构建就报链接错误。结合你的情况,大概率是CMake在Windows平台下的默认行为和Linux不一致导致的,给你几个亲测有效的解决思路:

  • 明确指定库的生成类型
    Linux下默认生成动态库(.so),但Windows下CMake如果没明确声明,有时候会默认生成静态库(.lib),或者你的测试代码期望链接动态库但实际生成了静态库,路径自然对不上。你可以在src目录的CMakeLists.txt里硬指定生成类型:

    add_library(foobar SHARED ${YOUR_SOURCE_FILES}) # 强制生成动态库
    # 要是你确实需要静态库,就把SHARED换成STATIC
    
  • 统一跨平台的输出目录,避免硬编码路径
    你错误里的路径是..\src\Debug\foobar.lib,这说明CMake可能把库输出到了src子目录的Debug文件夹里,但测试代码的链接路径没跟上。建议在顶层CMakeLists.txt里统一设置所有目标的输出目录:

    # 统一库和可执行文件的输出路径
    if(WIN32)
        # Windows下把动态库(.dll)放bin,静态库/导入库(.lib)放lib
        set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
        set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
    else()
        # Linux下统一放lib
        set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
    endif()
    

    然后在测试代码的CMakeLists.txt里,直接用目标名链接,不要写死路径:

    target_link_libraries(your_test_target PRIVATE foobar GTest::gtest_main)
    

    这样CMake会自动处理不同平台下的路径和库类型问题。

  • 强制测试目标依赖库目标
    Windows下MSBuild有时候会并行构建,可能测试代码已经开始链接了,但库还没编译完,导致找不到文件。可以在测试的CMakeLists.txt里加一行依赖:

    add_dependencies(your_test_target foobar)
    

    确保库先构建完成,再编译测试代码。

  • 检查构建模式是否一致
    你报错的路径是Debug目录下的lib,要确保你构建测试时用的是和库相同的构建模式(Debug/Release)。比如如果库是用Release模式编译的,测试却跑Debug构建,自然找不到对应的lib文件。用CMake构建时可以明确指定:

    # 配置Debug模式
    cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
    # 执行构建
    cmake --build build --config Debug
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:43