集成Google Test时链接主库与测试可执行文件遇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

