靜態編譯C C 程式

2022-05-04 03:30:12 字數 759 閱讀 1430

靜態編譯c/c++程式,讓程式執行不受平台限制

由於linux

作業系統的特有elf載入順序. (可以參考此文). 雖然可以很大程度上解決windows早期版本的dll hell問題, 但是給部署帶來了很大難度

一般常見的解決方法是, 找到乙個與目標linux版本及glibc版本一致的linux, 將**及依賴包放在之上編譯, 完成後再發布.這種方法與linux下常見軟體安裝方法類似. 但是對於商用伺服器部署步驟來說未免繁瑣, 安全性低.

還有一種方法,使用靜態鏈結. 將所有可執行檔案檔案依賴的靜態庫, 系統庫,全部靜態鏈結到可執行檔案中,可以一次性解決這個問題

步驟:1. 在gcc鏈結命令列中新增-static -static-libgcc -static-libstdc++

2. 將第三方依賴庫開啟靜態鏈結開關, 將原來鏈結.so的庫,全改為鏈結.a

3. gcc對鏈結庫順序很敏感, 鏈結庫順序需要按照從前至後為:  專案產生的靜態庫 > 第三方庫靜態庫 > 系統靜態庫

4. 鏈結時, 若有未解決的symbol, 可以嘗試在最後新增-lpthread及-lrt解決

在發布版本linux上執行可能遇到的問題:

terminate called after throwing an instance of 'std::runtime_error'

what(): locale::facet::_s_create_c_locale name not valid

解決方法: 執行之前執行export lc_all="c"

C C 程式編譯過程

編譯四個階段 編譯預處理,編譯階段,彙編階段,鏈結程式。編譯預處理 preprocessing 讀取源程式,對其中的偽指令 以 開頭的指令 和特殊符號進行處理。編譯 compilation 將經過預處理之後的程式轉換成特定彙編 的過程。彙編 assemble 將上一步的彙編 轉換成機器指令。鏈結 l...

Linux下C C 程式編譯

在編譯之前我們需要在系統裡安裝g gcc,它們就是linux下的c c的編譯器。如下 sudo apt get install build essential sudo apt get install gcc sudo apt get install g 好,現在我們在文字編輯器裡寫乙個c的簡單的程...

linux編譯執行C C 程式

在linux系統下編譯執行c c 程式。編譯c程式使用gcc,編譯c 程式使用g ubuntu14.04預設安裝了gcc,但是沒有安裝g 1.首先確定已經安裝gcc g 使用whereis gcc或者whereis g 檢視是否安裝gcc g 命令如下 liu liu whereis g 如果安裝,...