據說linux loader是/ usr/bin/ld,但通常我們使用gcc/g ++來鏈接庫和可執行文件,我們幾乎不使用「ld」。「gcc鏈接」和「ld鏈接」之間有什麼關係?
我最後一次用「LD」當我學習linux裝配手動爲,以生成可執行的唯一方法是LD .o文件生成可執行的情況下直接任意庫。
我的問題是,是包含「LD」的一些功能包裝GCC/G ++,因爲原始的「LD」是太難用?或者我們不應該明確地使用「ld」作爲c/C++程序鏈接,因爲blablabla?
非常感謝。
據說linux loader是/ usr/bin/ld,但通常我們使用gcc/g ++來鏈接庫和可執行文件,我們幾乎不使用「ld」。「gcc鏈接」和「ld鏈接」之間有什麼關係?
我最後一次用「LD」當我學習linux裝配手動爲,以生成可執行的唯一方法是LD .o文件生成可執行的情況下直接任意庫。
我的問題是,是包含「LD」的一些功能包裝GCC/G ++,因爲原始的「LD」是太難用?或者我們不應該明確地使用「ld」作爲c/C++程序鏈接,因爲blablabla?
非常感謝。
gcc提供了幾個默認選項ld
。
ld
不知道C++,或其他任何語言的任何東西。 ld
不知道你的代碼需要鏈接什麼庫。如果您嘗試直接將編譯後的C++代碼與ld鏈接起來,它將會幫助您,因爲ld
本身並不知道它在哪裏可以找到gcc的C++運行時庫libstdc++
。你使用字符串嗎?引導?其中大部分是作爲對象模塊的一部分進行編譯的模板代碼。但是還有一些預編譯位在libstdc++
之內,需要與之鏈接。
當你給gcc編譯的代碼鏈接時,gcc會有禮貌地把你的所有文件一起傳遞給ld
,並告訴ld
除了你明確指定的那些庫之外,哪些庫。
你可以直接鏈接ld
,如果你願意,只要你指定相同的庫和鏈接選項gcc
使用。但你爲什麼要這麼做?只需使用gcc鏈接你的gcc編譯的代碼。
我的問題是,是包含 「LD」
這是正確的一些功能包裝GCC/G ++。
,因爲原始的 「LD」 是太難用?
嗯,不是真的;你可以自己使用它,但也不會太麻煩,但是通過一個可執行文件,一組標誌以及一個命令來管理整個構建過程是很方便的。
如果你繞過了包裝器(儘管我沒有測試過),你也可能必須自己提供一些運行時庫(例如libstdC++。a)的絕對路徑。
或者我們不應該明確地使用「ld」作爲c/C++程序鏈接,因爲blablabla?
你可以自由地做,如果你想要的。人們可能會揚眉吐氣的唯一原因是問你爲什麼不按傳統方式做。如果您有充分的理由直接調用ld
,而不是通過g++
並通過任何鏈接器標誌,那就馬上行動吧!
您不應該嘗試直接使用ld
來鏈接C++程序,因爲您需要知道C++運行時庫靜態部分所在位置的實現細節。 g++
知道這些實現細節,例如在哪裏可以找到文件libstdc++.a
。如果您試圖直接使用ld
,則必須提供所有這些「缺失」的靜態庫。
你的意思是,即使我們默認使用libstdC++,那麼libstdC++裏面仍然有一些內容被靜態鏈接到我們的可執行文件中?這些內容在做什麼?謝謝。 – Troskyvs
另請參閱[當我應該使用ld而不是gcc?](http://stackoverflow.com/q/36680470),[將C++代碼與'gcc'(不含g ++)](http:// stackoverflow。 com/q/1001535)和朋友。 – jww