1. 程式人生 > >如何在linux的gcc中新增c語言的外部連結庫(“比如說,math.h"

如何在linux的gcc中新增c語言的外部連結庫(“比如說,math.h"

庫是預編譯的目標檔案(object files)的集合,它們可被連結程序序。靜態庫以後綴為‘.a’的特殊的存檔檔案(archive file)儲存。

標準系統庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統中 C 語言的數學庫一般儲存為檔案/usr/lib/libm.a。該庫中函式的原型宣告在標頭檔案 /usr/include/math.h 中。C 標準庫本身儲存為/usr/lib/libc.a,它包含 ANSI/ISO C 標準指定的函式,比如‘printf’。對每一個 C 程式來說,libc.a 都預設被連結。

下面的是一個呼叫數學庫 libm.a 中 sqrt函式的的例子,建立檔案ctest3.c

#include<stdio.h>
#include<math.h>
main()
{
  long int i,x,y;
  for(i=1;i<100000;i++)
    {
     x=sqrt(i+100);
     y=sqrt(i+268);
     if(x*x==i+100&&y*y==i+268)
      printf("\n%ld\n",i);
     }
}

嘗試單獨從該檔案生成一個可執行檔案將導致一個連結階段的錯誤:

[email protected]:~/han# gcc -o ctest3 ctest3.c
/tmp/ccGWSm28.o: In function `main':
ctest3.c:(.text+0x3c): undefined reference to `sqrt'
ctest3.c:(.text+0x75): undefined reference to `sqrt'
collect2: ld returned 1 exit status

函式 sqrt,未在本程式中定義也不在預設庫‘libc.a’中;除非被指定,編譯器也不會連結‘libm.a’。

為使編譯器能將sqrt連結進主程式‘ctest3.c’,我們需要提供數學庫‘libm.a’。函式庫‘libm.a’包含所有數學函式的目標檔案,比如sin,cos,exp,logsqrt。連結器將搜尋所有檔案來找到包含 sqrt的目標檔案。它的具體位置在/usr/lib檔案目錄下。

編譯器為連結函式庫提供了快捷的選項‘-l’。例如,下面的命令

gcc  -lm -o ctest3 ctest3.c 

與我們上面指定庫全路徑‘/usr/lib/libm.a’的命令等價。

輸出結果為:

[email protected]:~/han# ./ctest3


21


261


1581

一般來說,選項 -lNAME使連結器嘗試連結系統庫目錄中的函式庫檔案 libNAME.a。一個大型的程式通常要使用很多 -l選項來指定要連結的數學庫,圖形庫,網路庫等。

相關推薦

如何在linux的gcc新增c語言外部連結“比如說math.h"

庫是預編譯的目標檔案(object files)的集合,它們可被連結程序序。靜態庫以後綴為‘.a’的特殊的存檔檔案(archive file)儲存。 標準系統庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統中 C 語言的數學庫一般儲存為

JNA呼叫C語言動態連結學習實踐總結指標模擬)

最新因為專案需要,學習了一下JNA框架,在這裡記錄一下學習和使用心得,給大家分享,希望能幫助新手。 本文主要講解如何使用JNA框架輕鬆呼叫C語言動態連結庫,如何使用JNA模擬C語言引數(例如陣列、指標等)。 JNA(Java Native Access)框架

JNA呼叫C語言動態連結學習實踐總結

2.JNA模擬普通傳值引數 C語言函式: int function1(int a, float b, long c) JNA模擬: int function1(int a, float b, long c) 3.JNA模擬C語言陣列 C語言函式:

UNIX下C語言動態連結SO

#                                                                   # makefile for application preconsole program # # .SUFFIXES:.c .SUFFIXES:.cpre SYBA

C語言動態連結DLL的載入

靜態連結庫在連結時,編譯器會將 .obj 檔案和 .LIB 檔案組織成一個 .exe 檔案,程式執行時,將全部資料載入到記憶體。 如果程式體積較大,功能較為複雜,那麼載入到記憶體中的時間就會比較長,最直接的一個例子就是雙擊開啟一個軟體,要很久才能看到介面。這是靜態連結庫的一個弊端。 動態連結庫有兩種載入方

資料結構-c語言實現連結串列的建立增刪翻轉

很經典的課題了,這裡直接給出源程式: #include <stdio.h> #include <stdlib.h> #define LIST_MAX_LEN 10 typedef int ElementType; typedef int BOOL; #define TR

C語言實現連結串列的建立初始化插入刪除查詢

#include <stdio.h> #include <stdlib.h> #define OK 0 #define ERROR -1 #define MALLOC_ERROR -2 typedef int

c語言五大記憶體分割槽-全域性/靜態儲存區自由儲存區程式碼區)與可執行程式的三段-Text段Date段Bss段)

一、c語言五大記憶體分割槽 棧區(stack):存放函式形參和區域性變數(auto型別),由編譯器自動分配和釋放 堆區(heap):該區由程式設計師申請後使用,需要手動釋放否則會造成記憶體洩漏。如果程式設計師沒有手動釋放,那麼程式結束時可能由OS回收。

eclipse下生成dll連結實測附圖)

dll連結庫是windows環境下的動態連結庫,其內容可以為C/C++程式組成,其原理與linux環境下的so庫大同小異。 想要生成dll庫首先需要配置eclipse的開發環境,首先你需要個CDT元件

C程式】JSON怎麼用json.h全解

標頭檔案:#include "json/json.h"    // 當前目錄下使用:char *str = "{\"abc\": 123, \"wds\": 12.3, \"qwe\": \"ddd\", \"bool0\": false, \"bool1\": true,

C語言實驗計算時間差小時分鐘秒)

C語言實驗計算時間差(小時,分鐘,秒,只適用於同一天內) ```c #include <stdio.h> int main() { int hour1,min1,s1,ss1; int hour2,min2,s2,ss2; int

C語言常用函式函式

1.pow(x,y);求x的y次方; 2.strstr(str1,str2);判斷str2是否為str1的子串,若是返回首次出現的位置,若不是返回NULL; 3.strcat(char* dest, const char *src);字串剪接函式,將src接

在ROS呼叫外部連結檔案(.so)配置方法

舉例說明吧: 1、建立檔案樹如下: myproject: -include --Interface.h -lib --libInterface.so -src --control.cpp

Codeblocks建立和呼叫DLL動態連結C語言

建立一個最簡單的只有一個get_id() 函式的DLL庫  一、建立C語言動態連結庫 1.新建一個動態庫的工程 File - New - Project - DLL - Go 新建的工程原來的main.cpp和main.h刪除,新建兩個檔案simple.h, simple

C# 呼叫 C++ dll 動態連結多個函式時全域性變數的問題

    最近編寫C#程式呼叫C++語言的演算法庫,自己嘗試在C++中封裝好DLL庫,並在一個工程檔案中同時匯出多個函式供C#呼叫。多個函式之間需要相互通訊,但又不能互相呼叫,,一個很好的方法就是用全域

VS2015及VS2017組合語言呼叫C語言的stdio的函式

眾所周知,VS可以用來寫組合語言,同樣的在組合語言中,我們可以呼叫C語言中的函式,前提我們需要知道呼叫的函式在哪裡。例如下面這一段程式碼:;//VS15/17 Template for Win32 Console Application.686.MODEL flat, std

python呼叫動態連結C++linux)

1,建立並編譯C++程式 #include <fstream> #include <assert.h> #include <malloc.h> #incl

JSON的簡單介紹以及C語言的JSON使用

編程 delet 逗號 緩沖區 tdi 以及 and 項目 占用 JSON概述   JSON: JavaScript 對象表示法( JavaScript Object Notation) 。是一種輕量級的數據交換格式。 它基於ECMAScript的一個子集。 JSON采

linux編譯C語言程序

編輯器 ins spa include all 運行程序 gcc linux中 style 1.首先安裝gcc編輯器 yum install gcc* -y 2.編寫C語言程序 [[email protected]/* */ ~]# vim aa.c #i

C語言數據數據類型

適配器 偏移 生成 包含 建數據庫 decimal create prim 包括 ??數據類型是一種屬性,用於指定對象可保存的數據的類型,SQL Server中支持多種數據類型,包括字符類型、數值類型以及日期類型等。數據類型相當於一個容器,容器的大小決定了裝的東西的多少,將