當前位置:首頁 > 公眾號精選 > 21ic電子網(wǎng)
[導(dǎo)讀]你知道,為什么在C中使用了pow函數(shù)不需要鏈接libm庫嗎?什么情況需要指定鏈接庫?在解釋之前,先回顧一下。//來源:公眾號【編程珠璣】//https://www.yanbinghu.com#include#includeint?main(void){????int?b?=?2;...

你知道,為什么在C 中使用了pow函數(shù)不需要鏈接libm庫嗎?

什么情況需要指定鏈接庫?

在解釋之前,先回顧一下。

//來源:公眾號【編程珠璣】
//https://www.yanbinghu.com
#include
#include
int?main(void)
{
????int?b?=?2;
????double?a?=?pow(b,b);
????printf("%f\n",a);
????return?0;
}
代碼本身比較簡單,pow(x,y)用于計算x的y次冪。

這里由于pow函數(shù)并不在lib庫中,默認情況下,編譯的時候只鏈接了libc庫,因此如果不指定鏈接庫,則會報錯:

$?gcc?-o?test?test.c
/tmp/ccKDgtzz.o:?In?function?`main':
test.c:(.text 0x22):?undefined?reference?to?`pow'
collect2:?error:?ld?returned?1?exit?status
從報錯信息來看,我們知道是找不到pow函數(shù)的定義。

通過man手冊也可以查看到,編譯是需要包含頭文件math.h和鏈接數(shù)學(xué)庫的:

$?man?pow
???????#include?

???????double?pow(double?x,?double?y);
???????float?powf(float?x,?float?y);
???????long?double?powl(long?double?x,?long?double?y);

???????Link?with?-lm.
即像下面這樣是可以的:

$?gcc?-o?test?test.c?-lm
$?./test
4.000000
gcc在編譯的時候默認鏈接的是libc庫,其他庫需要手動指定。

但是,看下面的代碼:

//來源:公眾號【編程珠璣】
//作者:守望先生
#include
#include
int?main()
{
????int?b?=?2;
????double?a?=?pow(b,b);
????std::cout::endl;
????return?0;
}
編譯運行:

$?g ?-o?test?test.cpp
$?./test
4

我們并沒有手動指定鏈接庫,但是卻可以編譯過!

那么,問題來了!

為何在C 中使用pow函數(shù)不需要手動指定鏈接數(shù)學(xué)庫libm,而C里面卻需要呢?

為了解答這個問題,我們必須知道C 的程序中,到底有沒有鏈接libm庫。如何查看呢?還記得在《linux常用命令-開發(fā)調(diào)試篇》中提到的ldd嗎?它可以查看當前程序鏈接了哪些動態(tài)庫:

$?ldd?test
????linux-vdso.so.1?=>??(0x00007ffd41bda000)
????libstdc .so.6?=>?/usr/lib/x86_64-linux-gnu/libstdc .so.6?(0x00007f6230cca000)
????libm.so.6?=>?/lib/x86_64-linux-gnu/libm.so.6?(0x00007f62309c1000)
????libc.so.6?=>?/lib/x86_64-linux-gnu/libc.so.6?(0x00007f62305f7000)
????/lib64/ld-linux-x86-64.so.2?(0x00007f623104c000)
????libgcc_s.so.1?=>?/lib/x86_64-linux-gnu/libgcc_s.so.1?(0x00007f62303e1000)
看到?jīng)]有,除了鏈接了最基本的libstdc 庫,還鏈接了libc和libm庫!也就是說,雖然沒有手動指定鏈接,但是實際上還是鏈接了。但是這是什么時候鏈接上的呢?

我們再看libstdc 的鏈接庫發(fā)現(xiàn):

$?ldd?/usr/lib32/libstdc .so.6
????linux-gate.so.1?=>??(0xf7f92000)
????libm.so.6?=>?/lib/i386-linux-gnu/libm.so.6?(0xf7da6000)
????libc.so.6?=>?/lib/i386-linux-gnu/libc.so.6?(0xf7bf0000)
????/lib/ld-linux.so.2?(0xf7f94000)
????libgcc_s.so.1?=>?/lib/i386-linux-gnu/libgcc_s.so.1?(0xf7bd3000)
看見沒有!原來是libstdc 已經(jīng)鏈接了libm庫,這也就解釋了為什么C 代碼中不需要手動指定鏈接數(shù)學(xué)庫libm。

總結(jié):

通過前面的內(nèi)容我們總結(jié)如下:

  • C代碼編譯時,通常會默認鏈接libc庫

  • C 代碼編譯時,通常會默認鏈接libstdc 庫

  • 由于libstdc 中有依賴一些數(shù)學(xué)函數(shù)或者libc庫中的函數(shù),因此默認鏈接了libc庫和libm庫。



作者:守望先生來源:編程珠璣版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。

21ic電子網(wǎng)

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉