gcc g 編譯器切換版本 鏈結問題

2021-10-21 13:41:42 字數 1766 閱讀 5450

cd gcc-6.4.0

./contrib/download_prerequisites

三、構建

mkdir build

cd build

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

四、編譯(此步用時較長)

make
五、安裝

make install
六、檢視安裝並切換版本

ls /usr/local/bin | grep gcc

ls /usr/bin/gcc*

ls /usr/bin/g++*

七、切換預設編譯器

新增優先順序(eg:100):

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
注:gcc/g++版本號應該保持一致

八、儲存修改

sudo update-alternatives --config gcc
注:to select

檢視:

gcc -v

g++-v

編譯成.obj:無需具體實現,僅需函式原型(包含相應標頭檔案)

編譯成.exe:使用 -ldl鏈結庫,需要函式實現

常見報錯:

implicit declaration of function '***':未申明的引用 --找不到標頭檔案

對『***』未定義的引用--ld問題,找不到函式原型

gcc編譯器版本abi()問題:常發生在引用了string和list型別的採用gcc5之前版本編譯的第三方動態庫時。

不同版本編譯器對c++規範實現程度不一致,gcc5.1及之後版本為libstdc++新增了新的特性,新增了__cxx11命名空間,string和list型別實際上是std::__cxx11::string和std::__cxx11::list,所以我們一般的using namespace std就會變成形如using namespace std::__cxx11的樣子。

(1)修改cmake中的巨集定義以選擇鏈結庫版本,舊版(c++03規範)/新版(c++11規範)

if(conan_libcxx strequal "libstdc++11")

add_definitions(-d_glibcxx_use_cxx11_abi=1)

elseif(conan_libcxx strequal "libstdc++")

add_definitions(-d_glibcxx_use_cxx11_abi=0)

endif()

由於編譯環境工具鏈版本較高,多數gcc編譯器的cmake應新增 add_definitions(-d_glibcxx_use_cxx11_abi=0)來編譯。

(2)新增makefile選項: 

gcc -std=c14 -d_glibcxx_use_cxx11_abi=0 ........

Linux編譯器 gcc g 使用

gcc是乙個編譯器,將我們寫的高階語言轉化成機器語言 gcc如何完成 格式 gcc 選項 要編譯的檔案 選項 目標檔案 預處理 進行巨集替換 展開所有 gcc e 例 gcc e main.c o main.i o是重新命名,使main.c預處理後生成的檔案名叫main.i 編譯 生成彙編 糾錯,沒...

Linux編譯器 gcc g 使用

gcc 選項 要編譯的檔案 選項 目標檔案 預處理 進行巨集替換 在c語言程式中,並沒有printf函式的定義,stdio.h中也只有該函式的宣告,沒有該函式的實現。系統把這些函式的實現放到指定的庫檔案中例如 libc.so.6,gcc會到系統預設的路徑中進行查詢,這就是連線的作用 建立方法 將包包...

gcc(g )編譯器版本不同導致的報錯

linux 環境下 gcc version g version報錯資訊舉例 precompiler linux lib64 libc.so.6 version glibc 2.14 not found required by precompiler linux linux 環境下 檢視報錯庫的描述資...