无法查找或打开 PDB 文件和VS新建工程头文件链接不上的问题解决方法

在跑别人的C++工程的时候,遇到了这个问题

“ConsoleApplication1.exe”(Win32): 已加载“C:\Users\PC\source\repos\ConsoleApplication1\Debug\ConsoleApplication1.exe”。已加载符号。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。已加载符号。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel32.dll”。已加载符号。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。已加载符号。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\apphelp.dll”。无法查找或打开 PDB 文件。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcp140d.dll”。已加载符号。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\vcruntime140d.dll”。无法查找或打开 PDB 文件。
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ucrtbased.dll”。无法查找或打开 PDB 文件。
“ConsoleApplication1.exe”(Win32): 已卸载“C:\Windows\SysWOW64\ucrtbased.dll”
“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ucrtbased.dll”。无法查找或打开 PDB 文件。
线程 0x4844 已退出,返回值为 0 (0x0)。
线程 0x405c 已退出,返回值为 0 (0x0)。
线程 0x3130 已退出,返回值为 0 (0x0)。
程序“[328] ConsoleApplication1.exe”已退出,返回值为 0 (0x0)。

看了一些博客教程,大都是去调试打开一个选项,对问题本身治标不治本,比如

所以写了一下这个回答,希望对遇到相同问题的人能有所帮助

先说一下PDB文件是什么

当程序在 VS 上编译时,程序所依赖的所有动态链接库(dll 文件)也会被编译,编译过程中每个 dll 都会产生一个pdb文件,又称为“符号文件”,是一个存储数据的信息文件,其包含 dll 库在编译过程的某些调试信息,例如程序中所用到的全局变量、局部变量、函数名以及他们的入口地址等。

pdb 文件主要用于调试程序,多用于当VS中有多个项目,且项目之间互有依赖关系时,使用pdb文件调试程序,往往会事半功倍,初学者一般不会用到。

当使用VS 调试程序时,会默认加载你的程序以及程序依赖的dll库产生的所有pdb文件,但是结果往往是VS自己找不到依赖库的pdb文件,于是就提示给你“无法查找或打开pdb文件”。

参考http://c.biancheng.net/view/474.html

除了这个问题外,还有可能会存在VS版本不对、使用了的库路径不对等问题导致编译别人的项目不通过。

建议直接新建一个自己的工程,然后把.h和.cpp文件添加到自己的工程里。

 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== 

然而在建新工程后,发现编译报错

 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== 

明明已经在头文件中include却链接不上的

这是因为VS的预编译头所致的,VS15前预编译头是stdafx.h,17之后是pch.h

使用预编译头

  stdafx.h并不是标准C++头文件,也就是说,该文件本质上相当于自定义的一个头文件( 这里是VS默认自定义的文件),与项目的源代码文件存放在同一个文件文件夹下,通过#include"stdafx.h"引用;

  从内容上来说,头文件stdafx.h中可以包含

  1.标准系统包含文件

  2.经常使用的但不常更改的特定于项目的包含文件

  标准系统包含文件 : 即常用的与C标准库对应的头文件,如标准输入头文件stdio.h、字符串头文件string.h等文件。

  自定义的包含文件 : 即用户根据项目需要自定义的头文件。

  在使用头文件 stdafx.h 时,将所有源程序中所需的包含文件( .h 文件 )都包含在头文件stdafx.h中,具体的做法就是将原本各个文件中所需要的类似于#include<stdio.h>的头文件包含语句都存放在头文件stdfax.h中,之后各个单独的文件中不需要再对存在于stdafx.h中的头文件进行单独声明,而只需要包含有头文件stdafx.h即可。

    #include"stdafx.h"  //通过该语句包含头文件stdafx.h,该语句需放在每个源文件文件的开头,否则会报错

  同时,stdafx.h也可以存放内容改动较少的自定义的头文件。

  相应的,源文件stdafx.cpp中内容仅包含以下语句

  #include "stdafx.h" //事实上,stdfax.cpp只用于编译头文件stdafx.h中包含的所有内容

  事实上,stdafx.cpp只用于编译头文件stdafx.h中包含的所有内容

 

参考https://www.cnblogs.com/yhjoker/p/8110684.html

VS这点很难受,应该把预编译头放在第一个,就可以解决问题

 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== 

或者在新建项目的时候注意,选择空项目即可。

 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== 

 没想到这个#include "pch.h"位置还有讲究...折腾了一会

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章