導航:首頁 > 源碼編譯 > 編譯鏈接符號

編譯鏈接符號

發布時間:2023-05-28 08:18:52

A. c++ 編譯 鏈接是怎麼回事

compile和link是大多數語言從原代碼生成可執行程序的兩個步驟。

之所有有這兩個步驟因為幾乎任何一個程序都不是用一個原文件寫出來的。compile是先針對單獨原文件進行處理。link是把compile處理的結果組合成一個完整的可執行文件。

其實C/C++完全也可以一步成型,不需要compile和link兩個步驟,但是那樣的後果就是:一,每次生成可執行程序,必須翻譯全部源代碼;二,C語言的執行庫(printf, scanf這些)必須都以源代碼形式存在。這怎麼樣也說不過去吧。

另外頭文件不屬於compile和link過程,頭文件是預編譯過程的文件。

C/C++語言的完整編譯過程是

一、預編譯

處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。

二、編譯
把上面那個原文件編譯成.o或者VC里是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變數的描述、乃至段的描述等等。

三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到一起。(這里也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合一些其他數據,比如資源、可執行文件頭等等。

B. 命令行編譯鏈接,出現LNK2019錯誤,怎樣解決

在visual studio環境下編譯鏈接通過,但我在命令行模式下連接出現如下錯誤: /out:test01.exetest01.objtest01.obj : error LNK2019: 無法解析的外部符號 __imp__MessageBoxA@16 ,該符號在 函數 _MessageBoxPrintf 中被引用 test01.obj : error LNK2019: 無法解析的外部符號 __imp__GetSystemMetrics@4 ,該符 號在函數 _WinMain@16 中被引用 test01.exe : fatal error LNK1120: 2 個無法解析的外部命令 下述是我在msdn查到的相關資料: 無法解析的外部符號symbol,該符號在函數function中被引用 在 function 中找到了未定義的外部符號 (symbol)。若要解決此錯誤,請提供符號定義或移除引用它的代碼。 請看下面的示例: extern int i; extern void g();void f(){i++;g();}int main(){}如果在生成中包含的某個文件中沒有定義 i 和 g,鏈接器將生成 LNK2019。可以添加這些定義,方法是將包含這些定義的源代碼文件包括為編譯的一部分。或者可以將包含這些定義的 .obj 或 .lib 文件傳遞給鏈接器。 對於從早期版本升級到當前版本的 C++ 項目,如果定義了 __UNICODE 並且入口點為 WinMain,需要將入口點函數的名稱更改為 _tWinMain 或 _tmain。 導致 LNK2019 的常見問題有: 符號聲明包含拼寫錯誤,以致於符號聲明與符號笑塌定義不同。 使用了一個函數,但其參數的類型或數量與函數定義不匹配。 函數聲明使用和函數定義使用中的調用約定(__cdecl、__stdcall 或__fastcall)不同。 符號定義在編譯為 C 程序的文件中,而符號是在 C++ 文件中不帶 extern C 修飾符聲明的。在此情況下,請修改聲明,例如不是使用: extern int i; extern void g();而使尺升肢用: extern C int i; extern C void g(); 同樣,如果在將由 C 程序使用的 C++ 文件中定義符號,請在定義中使用 extern C。 符號定義為靜態,但稍後在文件外部被引用。 沒有定義靜態類成員。例如,應單獨定義下面類聲明中的成員變數 si: #include <stdio.h struct X {static int si;}; // int X::si = 0; // uncomment this line to resolve printf(/n%d,px[0].si); // LNK2019}/verbose 鏈接器選項幫助您查看鏈接器引用的文件。DUMPBIN 實陵世用工具的 /EXPORT 和 /SYMBOLS 選項還可以幫助您查看 dll 和對象/庫文件中定義的符號。

C. 編譯、鏈接和交叉鏈接的區別與聯系

1、鏈接是將目標代碼與其他對象文件(例如庫文件)合並成單個可執行文件的過程。在鏈接納運過程中,符號解析和地址重差茄旦定向等操作被執行。
2、虛擾交叉鏈接是指將不同的目標文件和庫文件進行鏈接,以生成適用於特定平台或操作系統的可執行文件。它通常用於開發跨平台應用程序。

D. 在附加依賴項裡面已經添加了相應的lib文件,為什麼編譯鏈接的時候還是提示無法解析的外部符號

我在vs2008環境下面遇到了這個問題
總算自己逗舉解決了
如果選擇的是win32而非x64配置,對應的庫目錄一定要設置到x86而非x64
在win32配置下使如指答用x64 directx 庫就會出現這種情況
解決方法:
假設directx目錄為 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
則對於win32配置
項目->屬性->C/C++->常規->附加包含目錄 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include
項目->屬性->鏈接器->常規->附加庫目錄 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86
然後選擇全部重渣慧新編譯
我就是這樣解決了這個問題

E. 計算機上程序編譯運行分別是什麼符號

意思和區別如下:
1、編譯:依賴於編譯器,英文是compile, vc中這一過程是將源代碼轉換成目標文件,如.obj文件,.rc文前旦件等。
2、生成:指的是鏈接的過程,英文是build.依賴於鏈接器. vc中在這一階段將所有的目標文件和所有需要用到的組件組合成一個整體,例如需要生成蠢螞的是windows系統下的PE可執行文件,鏈接器會依照特定格式慧檔擾將目標文件組合,最後生成PE格式的.exe或.dll文件。
3、調試:是所有或部分代碼編寫完成後,讓程序在調試器中運行,用這種手段對程序進行分析,找出並修正潛在問題。
4、運行:就是讓程序在系統中運行。

F. 在C編譯環境下出現符號未定義的鏈接錯誤

看看是什麼符號未定義,可能引用的外部變數或者函數沒有定義,這個可能是有.c源文件沒有編譯進來造成的

G. Linux 下 so 的符號鏈接機制是為什麼

為了升級方便,舉個例子來說,有個共享庫的文件名字叫作libfoo.so.1,某客戶程序使用該庫的功能,編寫代碼後編譯成功了。在連接生成二進制文件的客戶程序時,正規的做法是建立一個libfoo.so.1文件的鏈咐符號鏈接,名字通常會枯喚歲叫做libfoo.so,於是客戶程序的連接參數應該寫成-lfoo,連接生成二進制文件後我們使用ldd命沒睜令可以看到客戶程序依賴於libfoo.so.1這個庫文件。
此後,libfoo.so的開發者決定升級該庫,但是發布文件的時候文件名改成了libfoo.so.2,並且重新生成符號鏈接文件libfoo.so指向libfoo.so.2這個新版的共享庫。這樣做的好處是客戶程序在重新編譯的時候無需更改Makefile文件,仍然使用-lfoo這個連接參數即可。

H. 編譯dll時調用其他第三方dll,編譯通過但鏈接時提示無法識別的外部符號

「編譯後在Release中輸出打包的DLL」這個說法是不對的,或者說,是不行的。如果緩數罩使用了MFC的dll和其它第三方(包括自定義)DLL文件,那麼需要發布的時候,就需要製作一個「軟體安裝包」,這兒軟體安裝包打包了EXE,dll和你需要的其它數據文件(具體打包什麼是由你自己指定的),軟體打包工具軟體,VisualStudio自帶了一個,叫做:InstallShieldforVC6。這個程序使用比較復雜(需要自編代碼)也很靈活,簡單的安裝包製作畢銷軟體也有,你可以網上搜索一下,很多。另外,如果說,你只需要打包MFC標准DLL,那麼,就不是打包的問題了,很簡單,在RELEASE編擾鬧譯模式設置(project菜單)中,選擇MFC為靜態庫,那麼編譯之後的程序,就不需要拷貝MFC的標准DLL(或者vc環境)支持了。

I. 預編譯命令行由什麼符號開頭

#號是官方定義的,用於和其他類型區別的,不用多考慮,你就看看我給你的鏈接看看官方的說法

條件編譯符號#define ???
#if、#elif、#else 和 #endif 指令提供的條件編譯功能是通過預處理表達式和條件編譯符號來控制的。

conditional-symbol:(條件符號:)
除 true 和 false 外的任何標識符或關鍵字
條件編譯符號有兩種可能的狀態:已定義的或未定義的。在源文件詞法處理開始時,條件編譯符號除非已由外部機制(如命令行編譯器選項)顯式定義,否則是未定義的。當處理 #define 指令時,在指令中指定的條件編譯符號在那個源文件中成為已定義的。此後,該符號就一直保持已定義的狀態,直到處理一條關於同一符號的 #undef 指令,或者到達源文件的結尾。這意味著一個源文件中的 #define 和 #undef 指令對同一程序中的其他源文件沒有任何影響。

當在預處理表達式中引用時,已定義的條件編譯符號具有布爾值 true,未定義的條件編譯符號具有布爾值 false。不要求在預處理表達式中引用條件編譯符號之前顯式聲明它們。相反,未聲明的符號只是未定義的,因此具有值 false。

條件編譯符號的命名空間與 C# 程序中的所有其他命名實體截然不同。只能在 #define 和 #undef 指令以及預處理表達式中引用條件編譯符號。

J. 如何在編譯動態鏈接庫時報告未定義符號的錯誤

1可能頭文件有問題,2也有可能圖形驅檔拍動的飢檔問題,3可能你安裝WINTC的時候沒有勾選圖形驅動選項爛蠢亂!!!第三種情況是最大的可能!!!!!!

閱讀全文

與編譯鏈接符號相關的資料

熱點內容
傳奇引擎修改在線時間命令 瀏覽:105
php取域名中間 瀏覽:896
cad命令欄太小 瀏覽:830
php開發環境搭建eclipse 瀏覽:480
qt文件夾名稱大全 瀏覽:212
金山雲伺服器架構 瀏覽:230
安卓系統筆記本怎麼切換系統 瀏覽:618
u盤加密快2個小時還沒有搞完 瀏覽:93
小米有品商家版app叫什麼 瀏覽:94
行命令調用 瀏覽:434
菜鳥裹裹員用什麼app 瀏覽:273
窮查理寶典pdf下載 瀏覽:514
csgo您已被禁用此伺服器怎麼辦 瀏覽:398
打開加密軟體的方法 瀏覽:156
雲存儲伺服器可靠嗎 瀏覽:967
2核1g的雲伺服器能帶動游戲嘛 瀏覽:898
逆命20解壓碼 瀏覽:146
徐州辦犬證需要下載什麼app 瀏覽:1002
百保盾是什麼樣的app 瀏覽:699
文件和文件夾的命名規格 瀏覽:798