1. 程式人生 > >Linux編譯器gcc/g++的使用

Linux編譯器gcc/g++的使用

庫的概念

1.庫的定義

  本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。

2.庫的分類

  linux 下的庫有兩種:靜態庫和共享庫(動態庫)。 二者的不同點在於程式碼被載入的時刻不同。 靜態庫的程式碼在編譯過程中已經被載入可執行程式,因此體積較大。

  共享庫的程式碼是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,可以節省系統開銷,因此程式碼體積較小。不同的程式呼叫相同庫時,記憶體中只需有一份該動態庫的例項即可。

3.在Linux下庫檔案的產生

靜態庫(字尾是.a):

  • 由原始檔編譯生成一堆.o,每個.o 裡都包含這個編譯單元的符號表

  • ar 命令將很多.o 轉換成.a,成為靜態庫

  • 如:ar rcs libmyhello.a hello.o ,再編譯:gcc add.c -static -L. -lmyhello -o hello,執行可執行檔案:./hello
    描述

  • 此時發現執行gcc main.c -static -L. -lmyhello -o hello後報了一個錯誤,原因是你的系統中沒有安裝靜態庫
    描述

安裝靜態庫後執行發現結果正確:

描述

刪除靜態庫檔案發現程式照常執行,原因是靜態庫中的公用函式已經連線到目標檔案中

描述

動態庫(字尾是.so):

  • gcc hello.c -shared -fPIC -o libmyhello.so


    描述
    -PIC:表示 GCC 產生的程式碼不要包含對函式和變數具體記憶體位置的引用,即編譯為位置獨立的程式碼
    -shared:表示生成動態庫

  • gcc add.c -L. -lmyhello -o hello
    -L.:表示告訴 GCC 函式庫可能位於當前目錄

  • 若直接執行./hello會發現編譯器報錯,原因是GNU聯結器會查詢標準系統函式目錄,先後搜尋:①elf 檔案的 DT_RPATH 段—>②境變數LD _LIBRARY _PATH(此環境變數指示動態聯結器可以裝載動態庫的路徑)—>③/etc/ld.so.cache 檔案列表—>④/lib/或/usr/lib 目錄找到庫檔案後將其載入記憶體。但這裡生成的庫並沒有載入到這四個路徑中的任何一條,所以編譯器會報錯。
    描述

  • 解決方法:①將檔案 libmyhello.so 複製到目錄/usr/lib 中,再執行./hello
         ②先執行:export LD_ LIBRARY_PATH=$(pwd),再執行:./hello
         ③執行ldconfig /usr/zhsoft/lib,此命令的功能在於讓 ldconfig 將指定目錄下的
        動態連結庫被系統共享起來,會重建/etc/ld.so.cache 檔案
    描述

注:當靜態庫與動態庫同名時,gcc命令會優先使用動態庫

4.庫檔案的命名

  • 在 linux 下,庫檔案一般放在/usr/lib 和/lib 下

  • 靜態庫的名字一般為 libxxx.a,其中 xxx 是該 lib 的名稱。如:libc.a

  • 動態庫的名字一般為 libxxx.so.major.minor,其中xxx 是該 lib 的名稱,major 是主版本號,minor 是副版本號。如:libc.so.6

靜態庫連結時搜尋路徑順序

  1. ld 會去找 gcc 命令中的引數-L

  2. 再找 gcc 的環境變數 LIBRARY_PATH(該環境變數指定靜態連結庫檔案搜尋路徑)

  3. 再找內定目錄 /lib 或/usr/lib 或/usr/local/lib

動態庫連結時搜尋路徑順序

  1. 編譯目的碼時指定的動態庫搜尋路徑

  2. 環境變數 LD_ LIBRARY_PATH 指定的動態庫搜尋路徑(該環境變數指定動態連結庫檔案搜尋路徑)

  3. 配置檔案/etc/ld.so.conf 中指定的動態庫搜尋路徑

  4. 預設的動態庫搜尋路徑/lib

  5. 預設的動態庫搜尋路徑/usr/lib

gcc 編譯

 gcc編譯會有以下四個步驟:

  • 預處理(巨集替換、條件編譯、標頭檔案展開、去註釋)
    例項:gcc -E test.c -o test.i
    描述

  • 編譯(生成彙編)
    例項:gcc -S test.c -o test.s
    描述

  • 彙編(生成機器可執行程式碼)
    例項:gcc -c test.c -o test.o
    描述

  • 連結(生成可執行檔案或庫檔案)
    例項:gcc test.c -o test 或 gcc test.o -o test
    描述

 選項:

  • -o:指定生成的輸出檔名字

  • -E:僅執行編譯預處理

  • -S:將C程式碼轉換為彙編程式碼

  • -O0:編譯器優化級別(0表示沒有優化,1為編譯器預設值,3優化級別最高)

特殊記憶法:esc、iso

相關推薦

Linux編譯器gcc/g++的使用

庫的概念 1.庫的定義   本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 2.庫的分類   linux 下的庫有兩種:靜態庫和共享庫(動態庫)。 二者的不同點在於程式碼被載入的時刻不同。 靜態庫的程式碼在編譯過程中

Linux編譯器——gcc

一、介紹      GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的程式語言編譯器。GCC原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準

自動萬能makefile(linux ubuntu gcc/g++),讓makefile的編寫不在煩人

自動萬能makefile(linux ubuntu gcc/g++),讓makefile的編寫不在煩人 keyword: wildcard notdir patsubst findstring wordlist suffix foreach

Linuxgcc/g++、make和cmake的區別

文字程式到可執行檔案生成無論在什麼平臺大致分為以下幾個部分:    1.用編輯器編寫原始碼,如.c檔案。    2.用編譯器編譯程式碼生成目標檔案,如.o。    3.用連結器連線目的碼生成可執行檔案,如.exe。    Linux平臺下,.o檔案一般是通過編譯的但還未連結的

Linuxgccg++編譯器

1.2 -c span logs style div out com 成了 1.gcc編譯器   gcc編譯器開發初期定位為C編譯器(GNU C Compiler),但隨著時間的發展gcc編譯器能夠支持多種語言。 1.1 gcc編譯器的使用   假如我們已經有了.c文件名稱

Linux環境下GNU, GCC, G++編譯器(轉)

c代碼 但是 關系 例如 ann name 語法規則 否則 int 一,GNU GNU是“GNU ‘s Not Unix”的遞歸縮寫, Stallman宣布GNU應當發音為Guh-NOO(革奴)以避免與new這個單詞混淆(註:Gnu在英文中原意為非洲牛羚,發音與new相同)

Linux C/C++ 編譯器cc\gcc\g++\c++區別

使用Linux系統的編譯c或者c++的人,都知道Linux系統的編譯器有cc\gcc\g++\c++,但是他們之間到底是什麼關係呢? 首先到系統的/usr/bin路徑下,使用命令:ll | grep cc,可以看到如下: 由此,可以知道LInux系統下,cc就是gcc

linux和windows gcc g++ vc編譯器位元組對齊

首先可以肯定的說,肯定和編譯器有關,vc編譯器和gcc,g++編譯器肯定不一樣,不說明是什麼編譯器什麼系統下問你結構體長度就是在耍流氓。 (1)vc編譯器下結構體成員首地址地址必須被該結構體成員長度整除,打個比方,double a的首地址如果為0x06, 那是不行的,再填2

Windows Sublime Text 配置Linux子系統(WSL)下的 gcc/g++ 編譯環境

include 12px 重啟 結果 ctr 檢驗 AC system pat 0. 簡介(若已了解背景可以跳過此部分) Windows 10 Build 14316以上版本中加入了“Windows系統的Linux子系統”(Windows Subsystem for Lin

linux 安裝gccg++

pre OS 最簡 lin 語言 cenos eno 回車 linu 以CentOS為例,安裝後是沒有C語言和C++編譯環境的,需要手動安裝,最簡單的是用yum的方式安裝,過程如下: 1、安裝gcc yum install gcc 詢問是否,按y鍵回車即可,或者 yu

安裝交叉編譯器arm-arago-linux-gnueabi-gcc

安裝交叉編譯工具鏈: https://releases.linaro.org/components/toolchain/binaries/6.2-2016.11/arm-linux-gnueabihf/ https://developer.arm.com/open-source/gnu-

Linuxgccg++的區別

Windows中我們常用vs來編譯編寫好的C和C++程式碼;vs把編輯器,編譯器和偵錯程式等工具都整合在這一款工具中,在Linux下我們能用什麼工具來編譯所編寫好的程式碼呢,其實Linux下這樣的工具有很多,但我們只介紹兩款常用的工具,它們分別是gcc和g++. 工具用法介紹 gcc

Linux】安裝vim gcc/g++ gdb

在Linux下,編輯一個程式碼需要用到vim,編譯c語言需要gcc,編譯c++需要g++,除錯程式需要gdb。這個工具都需要自己進行安裝。那麼他們是怎麼安裝的?vim 1.在命令列輸入vi,檢視vim資訊如下: 2.退出後在命令列輸入ls -a,檢視是否有.vimrc和

linux開發工具學習(vim、gdb、gcc/g++、makefile)

一. 編輯器vim 1.vim的常用操作總結 2.vim的簡單配置 低配版vim 目錄/etc/下面,有一個vimrc的公共配置檔案,對所有的使用者都可用。但是我們一般不這樣做,為了保證使用者的獨

Linux下重要命令,許可權及gcc/g++,gdb,vim的安裝

Linux重要命令: su 切換使用者 -c<指令>或–command=<指令>:執行完指定的指令後,即恢復原來的身份; -f或——fast:適用於csh與tsch,使shell不用去讀取啟動檔案; -l或——login:改變身份時,

Linux系統使用入門進階總結(6)——Ubuntu下gcc/g++編譯連結過程

文章轉自: https://blog.csdn.net/VennyJin/article/details/82794331 這裡講的是最簡單的c/c++檔案在linux下編譯連結的過程,後期還可以使用cmake來完成更復雜的工程構建過程。請關注博主的後續文章哈~~~ Ubuntu下gcc

arm-linux-androideabi-gcc 預定義巨集(編譯器版本4.8)

列印方法: touch test.c arm-linux-androideabi-gcc -E -dM -c test.c >> marco_arm.txt #define __DBL_MIN_EXP__ (-1021) #define __HQ_FBIT__

linux 離線安裝gcc g++,ncurses元件

安裝g++ 1.上傳gcc-c++-4.8.5-11.el7.x86_64.rpm(隨便版本的rmp都行咯) 2.忽略關聯性,強制安裝 rpm -ivh gcc-c++-4.8.5-11.el7.x86_64.rpm --nodeps --force (因為關聯的東西不在會

[Linux][2015-03-17] gcc/g++ 編譯選項

GCC的幾個常用選項                                gcc常用的編譯選項對程式碼的影響 建立時間:2001-12-21 文章屬性:原創 文章來源:http://xfocus.org/ 文章提交:alert7 (sztcww_at_sina.com) 測試環境 redhat 6

GCC/G++編譯器和VS IDE中的一些預定義巨集和使用者自定義巨集

預定義巨集,  編譯器通常會根據平臺和編譯選項的不同,為被編譯的程式提供不同的預定義的巨集, 例如WIN32 WIN64 LINUX, 例如DEBUG, RELEASE. 1. 在使用gcc/g++編譯器時,可以通過以下命令打印出編譯器預編譯的巨集。 gcc -dM -E - < /dev/null