在跑別人的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文件添加到自己的工程裏。
然而在建新工程後,發現編譯報錯
明明已經在頭文件中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這點很難受,應該把預編譯頭放在第一個,就可以解決問題
或者在新建項目的時候注意,選擇空項目即可。
沒想到這個#include "pch.h"位置還有講究...折騰了一會