clang 編譯器使用

2021-08-21 04:59:39 字數 2390 閱讀 4272

通常的程式需要經過預處理階段編譯階段彙編階段,鏈結階段

#include

using

namespace std;

intmain()

1.生成預處理檔案clang++ -e test.cc -o test.i預處理檔案test.i如下

# 1 "test.cc"

# 1 "" 1

# 1 "" 3

# 342 "" 3

# 1 "" 1

# 1 "" 2

# 1 "test.cc" 2

# 1 "/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/iostream" 1 3

# 37 "/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/iostream" 3

....

生成彙編源程式test.s,clang++ -s test.i源程式如下:

.text

.file "test.cc"

.section .text.startup,"ax",@progbits

.p2align 4, 0x90 # -- begin function __cxx_global_var_init

.type __cxx_global_var_init,@function

__cxx_global_var_init: # @__cxx_global_var_init

.cfi_startproc

# bb#0:

pushq %rbp

.lcfi0:

....

3, 生成目標檔案test.oclang++ -c test.s程式處理過程如下:

或者可以直接將函式生成.o檔案,將.o檔案生成.a靜態鏈結庫,將靜態鏈結庫新增到主函式中。

靜態鏈結庫和靜態鏈結庫:靜態鏈結庫是obj檔案的乙個集合,擴充套件名為.a。靜態鏈結庫由程式ar生成,可以再不用重新編譯程式庫**的情況下,進行程式的重新鏈結,這種方法節省了編譯過程的時間。靜態庫的另乙個優勢是開發者可以提供庫檔案給使用人員不用開放源**。理論上靜態庫比動態庫速度快1%-5%.

# 生成`add.o`檔案

clang++ -c add.cc

# 生成`libadd.a`靜態鏈結庫

ar -rcs libstr.a add.o

# 生成二進位制檔案

clang++ -o t main.cc libadd.a

# 或者在系統目錄下查詢靜態鏈結庫引數不包含靜態鏈結庫`libadd.a`的`lib`和`.a`

clang++ -o t main.cc -ladd

# 如果在指定目錄查詢需要使用

clang++ -o t main.cc -l./ -l add

動態庫是程式執行時載入的庫,當動態庫正確安裝後,所有的程式都可以使用動態庫執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,真實位址在呼叫動態庫的程式載入時形成。

動態庫的名稱有別名(soname),真名(realname)和鏈結名(linker name)。別名由乙個字首lib,然後是庫的名字加上.so構成。真名是動態庫的真實名稱,一般總是在別名的基礎上加上乙個小的版本號,發布版本構成。除此之外,還有乙個鏈結名,即程式鏈結時使用的庫的名字。在動態鏈結庫安裝的時候總是複製庫檔案到某個目錄,然後用軟連線生成別名,在庫檔案進行更新的時候僅僅更新軟連線即可。

clang++ -shared -wl,-soname,libadd.so -o libstr.so.1 add.cc

編譯器使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

Android NDK 使用 Clang 編譯器

我們在使用 cocos2dx 進行跨平台開發的時候,一種情景是我們在 mac 上利用 xcode 的開發環境進行開發。當我們把 放到 android ndk 上,想編譯成 android 應用的時候,有時候會出現編譯錯誤,這主要是我們在 mac 上的時候,在 c 裡使用了過多的 c 11 功能,比如...

Clang編譯器的使用

在linux中安裝clang相當方便 clang version 就會看到當前安裝的clang的版本和目標平台等資訊。在win中使用clang編譯目標檔案如果需要包含頭檔案目錄和庫目錄。所以使用clang編譯命令的時候需要設定包含的include路徑和lib路徑。設定包含標頭檔案路徑和包含庫檔案分別...