CMake RelWithDebInfo 配置下的 pdb 文件位置

使用 CMake、VS 2015 来编译 gtest 时,发现 RelWithDebInfo 配置下,输出目录并没有生成包含编译信息的 pdb 文件, 我们看看这个问题能不能解决

环境

本文使用 CMake,VS 2015 来编译 google test,相关版本信息如下:

使用到的程序 版本 下载地址
CMake 3.12.0 https://cmake.org/files/v3.12/cmake-3.12.0-win64-x64.msi
VS 2015 14.0 https://go.microsoft.com/fwlink/?LinkId=532606&clcid=0x409
google test 1.8.0 https://github.com/google/googletest/archive/release-1.8.0.zip

其实本文也使用了另一个版本的 CMake(3.11.4),因为推测是 CMake 的 bug 所以升级到了最新版,但是问题依旧

重现问题

  1. 首先解压 google test
  2. 打开 VS2015 x64 本机工具命令提示符,切换到 google test 解压后的目录,使用以下命令生成 sln 解决方案:

    mkdir build
    cd build
    cmake .. -G"Visual Studio 14 2015"
  3. 打开 build\googletest-distribution.sln
  4. 选择 Debug 配置编译 ALL_BUILD,我们可以看到 build\googlemock>est\Debug 下已经生成了 lib 和 pdb 文件
  5. 选择 RelWithDebInfo 配置编译 ALL_BUILD, 在 build\googlemock>est\RelWithDebInfo 下却只有 lib,没有 pdb 文件
  6. 新建一个使用生成的 gtest.lib 测试项目
  7. 使用 RelWithDebInfo 配置生成的 lib 时,编译器会提示警告

    gtest.lib(gtest-all.obj) : warning LNK4099: 未找到 PDB“gtest.pdb”(使用“gtest.lib(gtest-all.obj)”或在“D:\src\ut\x64\Release\gtest.pdb”中寻找);正在链接对象,如同没有调试信息一样
    
  8. 使用 Debug 配置生成的 lib 时,编译器一切正常,这说明 RelWithDebInfo 其实也生成了 pdb,但是却没有复制到输出目录

解决

分析到这里其实问题解决也就简单了,在 build 目录下搜索 pdb 文件,我们发现 pdb 文件位于以下位置:

build\googlemock\gtest\gtest.dir\RelWithDebInfo

当然这个输出位置在 gtest 项目配置里也可以找到,把 $(IntDir) 改为 $(OutDir) ,就可以输出到和 gtest.lib 相同的位置: https://i.loli.net/2018/08/02/5b62bd78160b6.png

很明显 CMake 生成的项目没有把 pdb 复制到输出目录,寻求原因时我们发现之前 CMake 也有 这个问题, 但是升级到最新版问题依然存在

总结

编译 CMake 生成的 VS 解决方案时,如果使用 RelWithDebInfo 配置,项目并不会自动把 pdb 文件复制到输出目录,需要自行寻找, 或修改生成的项目文件