linux常用知識點小記

1、linux中使用 -I來指定頭文件所在的路徑;

2、可以在某個目錄下查找:例如在/usr/include 目錄下查找EXIT_結尾的宏定義,可以用grep EXIT_ *.h

3、在linux中庫是預先編譯好的一組函數的集合,他們是按照可重用的原則編寫的。在linux中標準庫文件一般存儲在/usr/lib和/lib目錄下面。linux中庫的名字是有一定的規則的:以lib開始,後面表示的具體什麼庫,比如(c表示c語言庫,m表示數學庫);.a結尾的是靜態庫,.so結尾的是動態庫。在編譯c文件的時候 如果需要用到數學庫,可以在編譯的時候 -lm,這就表示使用標準庫目錄中的libm.a, 使用-lm的這樣的好處是當有共享庫的時候,會優先選擇共享庫。如果需要指定搜索的庫的路徑,可以使用-L來指定。

4、在未寫main函數之前如果想要驗證語法的正確性,可以使用gcc -c text.c 進行編譯;

5、在linux中編譯靜態庫:

      假如:我們創建add.c和dec.c這兩個函數實現的功能分別是求和和做差的功能:

在add.c文件中
#include <stdio.h>
int add(int a,int b)
{
    return (a+b);
}
在dec.c文件中
#include <stdio.h>
int dec(int a,int b)
{
    return (a-b);
}

然後gcc -c add.c dec.c 編譯成功,會生成對應的.o文件;

現在我們可以編寫main函數驗證這個庫是可以使用的:

在main.c中:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"   //這個頭文件中聲明int add(int,int)和int dec(int,int)函數的


int main(int argc,char *argv[])
{
    printf("add=%d.\n",add(3,4));

    return 0;
}

gcc -o app main.c add.o dec.o 編譯成功,運行./app可以輸出7,說明這個庫是正確的;

現在我們生成靜態庫:(使用ar工具)

ar crv libfoo.a add.o dec.o

a - add.o
a - dec.o
-c 如果存檔文件不存在,則創建,並不顯示ar發出的警告;-r  向存檔文件中插入.o文件,替換已有的任何同名文件,新成員添加到文檔末尾;-v表示詳細顯示程序執行的信息。

然後我們可以gcc -o app main.c libfoo.a;

如果使用gcc -o app main.c -lfoo 需要用-L來指定搜索的靜態的當前路徑:即:gcc -o app main.c -L. -lfoo纔可以,因爲默認是到標準庫目錄中去找庫文件的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

當多個函數都使用靜態庫時,就會出現一個函數的多個副本;因此共享庫是爲了解決這個問題,簡單的理解就是隻有當程序唄加載到內存中運行時,纔會調用到共享庫,程序不運行時,是不會加載動態庫的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章