鍍金池/ 問答/C  C++  Linux  網(wǎng)絡(luò)安全/ Linux下cmake什么時候需要鏈接系統(tǒng)so,什么時候不需要?

Linux下cmake什么時候需要鏈接系統(tǒng)so,什么時候不需要?

在嘗試使用cmake編譯代碼。
在寫CMakeLists的時候發(fā)現(xiàn)例如sqrt這樣的函數(shù),在libm.so中,就需要在編譯的時候鏈接。
但是像malloc、memset、free這樣的函數(shù)就不用鏈接動態(tài)庫。
請問這其中有什么規(guī)律嗎?

回答
編輯回答
愛礙唉

math.h里的函數(shù)需要libm,486以前CPU不集成協(xié)處理器,有的機器會沒有協(xié)處理器,這時浮點運算需要軟件模擬。為了節(jié)約內(nèi)存和鏈接時間,所以早期編譯軟件包括Turbo C都把不常用的數(shù)學(xué)運算單獨做一個模塊,不用浮點運算就不需要它了,甚至可能在libm里實現(xiàn)了支持浮點版本的printf。

2018年4月29日 12:35
編輯回答
晚風(fēng)眠

你說的malloc、memset、free都是屬于C標(biāo)準(zhǔn)庫的,gcc會幫我們鏈接,但是sqrt屬于數(shù)學(xué)庫不屬于標(biāo)準(zhǔn)庫,所以需要手動-lm,寫個Hello World,然后-v編譯下:

$ gcc -v hello.c

最后幾行就可以看到到底鏈接了什么:

/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../.. /tmp/cc18ZA1j.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crtn.o

或者 ldd a.out可以看程序鏈接了哪些動態(tài)庫

[root]$ ldd a.out 
    linux-vdso.so.1 =>  (0x00007ffd2e153000)
    libc.so.6 => /lib/libc.so.6 (0x00007f912499a000)    
    /lib64/ld-linux-x86-64.so.2 (0x00007f9124d83000)
2018年4月10日 03:14
編輯回答
萌小萌

在寫CMakeList時,由于像malloc printf這類函數(shù),都是屬于標(biāo)準(zhǔn)庫的函數(shù),在好多l(xiāng)inux系統(tǒng)中已經(jīng)將其默認(rèn)的鏈接進去,所以在寫時并不需要我們手動進行鏈接,但是math庫并不是一個標(biāo)準(zhǔn)庫,linux系統(tǒng)并沒有默認(rèn)的鏈接這個庫文件,因此你需要手動顯式的進行鏈接。

2017年4月15日 22:06