1. 程式人生 > >Linux上C語言標準數學函式庫的引用

Linux上C語言標準數學函式庫的引用

       eclipse安裝了CDT外掛之後就可以在上面編輯、編譯、連結、執行C/C++程式了,但是不同於gcc編譯器的純命令列操作,eclipse上基本上都是通過圖形化介面實現的,只需要進行簡單的設定就可以實現特定的功能。函式庫通常可以靜態連結庫(*.a檔案)和動態連結庫(*.so檔案)的形式存在,在Linux中,除錯一個程式如若需要用到非標準的C函式庫,例如用到標準數學函式庫,則需要進行特別指明。

   1.問題說明

      我在設計一個程式時,程式中用到了sqrt()函式,在Windows上Visual Studio中開發時無需特別指明所需要應用到的連結庫,但是在 Linux系統下就會出現如下問題。

     在eclipse 中的問題如圖示:    

    

    意思是說“沒有定義引用的sqrt函式”,系統找不到sqrt()函式的連結檔案。

    同樣的問題出現在Linux中為:

   

      問題原因:總得來說是系統找不到定義sqrt()的標準數學函式庫libm.a/lib.so,標準數學函式庫不同於C語言標準函式庫,而Visual Studio上可以實現自動比較差異並實現自動正確引用,無需使用者特別指明,但在Linux上需要使用者理解其中的關係並顯示指明

  2.解決問題

         先從命令列出發,因為eclipse上的配置也是根據命令列來的。兩種問題的解決思路分別如下所示:

      2.1 Linux命令列

         在編譯時(更準確地說是在連結時)指定引用的標準數學函式庫,如下所示:

[[email protected] src]$ gcc -o ACO  ACO.c -lm

          -lm是簡寫,它代表的是標準庫目錄(在我所用的CentOS6.5中是/usr/lib64)中名為libm.a或者libm.so的函式連結庫。-lm的好處是如果有動態連結庫(共享庫),編譯器會自動選擇動態連結庫庫,即lib.so檔案(如果存在)比libm.a有更高的優先順序。在我的CentOS6.5系統中,libm.a與libm.so的位置為:

[
[email protected]
Desktop]# find / -name libm.so /usr/lib64/libm.so /usr/lib/x86_64-redhat-linux5E/lib64/libm.so [[email protected] Desktop]# find / -name libm.a /usr/lib/x86_64-redhat-linux5E/lib64/libm.a
        因此係統會選擇/usr/lib64/libm.so檔案進行連結(在我的CentOS 6.5系統中,該檔案為符號連結檔案,經過多層連結之後指向/lib64/libm-2.12.so)。因此命令列下的解決方法等同於:
[[email protected] src]$ gcc -o ACO  ACO.c /usr/lib64/libm.so

      2.2 eclipse的CDT外掛

        同樣,解決方法的原理是一樣的,在編譯時(更準確地說是在連結時)指定引用的標準數學函式庫。方法為:選中專案後右鍵->Properities->C/C++ Build->Settings->GCC Linker->Miscellaneous->在右邊欄目Other options(-Xlinker [linker])中新增-lm,然後確認就行了。如下圖所示:

     

總結:我已經適應了Windows上的“傻瓜式”的開發方式,但是在Linux平臺上,我需要知道更多的偏向底層配置之類的高大上的知識,這樣能夠加深對技術的理解。但這個學習過程是很麻煩的,不過樂也在其中。

相關推薦

LinuxC語言標準數學函式引用

       eclipse安裝了CDT外掛之後就可以在上面編輯、編譯、連結、執行C/C++程式了,但是不同於gcc編譯器的純命令列操作,eclipse上基本上都是通過圖形化介面實現的,只需要進行簡單的設定就可以實現特定的功能。函式庫通常可以靜態連結庫(*.a檔案)和動態

linuxc語言利用iconv函式實現utf-8轉unicode

    由於專案中需要轉換原生unicode到ascii的功能,本來想的用的是linux或者windows自帶的寬位元組轉成窄位元組的函式,但由於本身使用了apr_iconv庫,所以直接使用庫函式來解決。     期間碰到了庫函式使用一直出錯的問題,一

linuxC語言實現udp

目的:C語言實現udp_client 和udp_server功能,實現簡單的資料收發功能;參考出處:1、https://www.cnblogs.com/yuqiao/p/5786427.html //socket介面詳解2、https://blog.csdn.net/zgrj

C API--linuxc語言讀取資料庫內容(mysql)

這裡歸納了C API可使用的函式,詳見MYSQL手冊 函式 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查詢更改/刪除/插入的行數。 mysql_autocommit() 切換 autocommit模式,ON/OFF mysql

c/c++語言-string.h函式

string.h 頭定義了一個變數的型別,操作字元陣列的一個巨集觀和各種功能。庫變數以下是在頭string.h中定義的變數型別:S.N. 變數和說明1 size_t 這是一個無符號整數型別的sizeof關鍵字的結果。庫巨集以下是在頭string.h中定義的巨集:S.N. 巨集

linuxc語言 獲得網路介面的統計值

這個東東,蠻好玩的。其實就是讀取了/proc/net/dev 檔案。 struct netdev_stats {     unsigned long long rx_packets_m;    /* total packets received       */    

C語言入門(6)——C語言常用數學函式

在編碼過程中會經遇到數學運算,幸運的是C語言提供了非常豐富的數學函式庫。在數學中使用函式有時候書寫可以省略括號,而C語言要求一定要加上括號,例如sin(pi/2)這種形式。在C語言的術語中,pi/2是引數,sin是函式,sin(pi/2)是函式呼叫。函式呼叫也是一種表示式。這

linuxC語言TCP通訊

使用c語言實現TCP client和server的簡單通訊功能出處:https://blog.csdn.net/lovekun1989/article/details/41042273 TCP client 測試:TCP server測試:/*----------------

Linux C語言程式設計-Linux資料庫操作--LinuxC語言操作SQLServer---知識點總結+例項

*********************注意:為了保證文章的完整性和全面性,作者會不定期對文章進行更新和修正********************* 1.freetds是什麼?     freetds其實就是個軟體而且是一款開源軟體,而且這個軟體支援相當多的系統,比如

python 像C語言樣的函式引數引用實現..

python中有傳參需求,好像也沒有像C一樣傳參(引用)設計,可以採用一種變形方式,函式返回值來實現。 def test(): t1 = "123123" t2 = "test" t3 = 122 t

嵌入式Linux開發常用C語言標準函式

推薦兩個網站: http://www.cplusplus.com/ 各大語言基礎入門必備網站 菜鳥教程:http://www.runoob.com/ 標準輸入/輸出類函式 scanf() http://www.runoob.com/cprogramming/c-functio

Linuxc語言的圖形程式設計(轉) curses.h 函式

這是轉貼哈,最近想吧TC的圖形程式設計搞到LINUX下面來,所以就對其有所研究了哦。http://tech.techweb.com.cn/viewthread.php?tid=181892註明了轉載,以後自己牛了再自己寫,呵呵。先看看哈。  以下是UNIX下c語言的圖形程式設

C語言標準中round函式

本文轉自---http://demon.tw/programming/c-round.html C語言標準庫中有沒有round函式?答案是,可能有,也可能沒有。這取決於你使用的編譯器,更準確地說,是編輯器是否支援C99標準。 讓我們簡單回顧一下C語言標準的歷史:C的第一個標

Cmath——C語言數學函式

int abs(int i) 返回整型引數i的絕對值  double cabs(struct complex znum) 返回複數znum的絕對值  double fabs(double x) 返回雙精度引數x的絕對值  long labs(long n) 返回長整型引數

C語言標準

span oca baidu linu math.h mit signal url math   共15個,請查看,在linux下的目錄位/usr/share/include assert.h ctype.h errno.h float.h limits.h

LINUXC語言編程調用其他函數、鏈接頭文件以及文件

blog head.s 鏈接 color pre () 如果 編譯 聲明 LINUX下C語言編程經常需要鏈接其他函數,而其他函數一般都放在另外.c文件中,或者打包放在一個庫文件裏面,我需要在main函數中調用這些函數,主要有如下幾種方法: 1.當需要調用函數的個數比較少時,

LinuxC語言pause()函式:讓程序暫停直到訊號出現

C語言pause()函式:讓程序暫停直到訊號出現   相關函式:kill, signal, sleep 標頭檔案:#include <unistd.h> 定義函式:int

c語言——linuxc開發編譯tips

vim編輯 gcc編譯 gdb除錯 vim小技巧:shift+v再按下箭頭可以選中多行 y複製多行,d刪除多行 c語言執行步驟: 預處理->編譯->連結 預處理gcc -E main.c -o main.i(標頭檔案替換,巨集替換,刪除註釋)

Linux學習(C語言學習之函式的使用)

C語言的函式在理解和使用中主要從以下幾個方面來思考: 什麼是函式? 函式的入口引數 函式的返回值 函式具備三要素: 1、函式名 (地址) 2、輸入引數 3、返回值 在定義函式時,必須將三要素告訴編譯器; 命令:man 3 printf;可以檢視關於printf的

利用C語言標準生成一個真隨機數的方法

        首先需要明確一點的是,計算機系統中生成一個隨機數,需要依賴一個隨機量,這個隨機量稱為隨機數種子。否則生成的就是偽隨機數。隨機數種子的值越多樣化,生成的數就越隨機。通常,隨機數種子從計算機系統外部引入,例如人的操作、ADC採集到的值等。         C語言