無法查找或打開 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"位置還有講究...折騰了一會

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