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
靜態庫連結時搜尋路徑順序
ld 會去找 gcc 命令中的引數-L
再找 gcc 的環境變數 LIBRARY_PATH(該環境變數指定靜態連結庫檔案搜尋路徑)
再找內定目錄 /lib 或/usr/lib 或/usr/local/lib
動態庫連結時搜尋路徑順序
編譯目的碼時指定的動態庫搜尋路徑
環境變數 LD_ LIBRARY_PATH 指定的動態庫搜尋路徑(該環境變數指定動態連結庫檔案搜尋路徑)
配置檔案/etc/ld.so.conf 中指定的動態庫搜尋路徑
預設的動態庫搜尋路徑/lib
預設的動態庫搜尋路徑/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
Linux下gcc/g++、make和cmake的區別
文字程式到可執行檔案生成無論在什麼平臺大致分為以下幾個部分: 1.用編輯器編寫原始碼,如.c檔案。 2.用編譯器編譯程式碼生成目標檔案,如.o。 3.用連結器連線目的碼生成可執行檔案,如.exe。 Linux平臺下,.o檔案一般是通過編譯的但還未連結的
Linux之gcc與g++編譯器
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 安裝gcc 和 g++
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-
Linux的gcc和g++的區別
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