把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器
3.0 本講目錄
本系列視頻,B站首發(fā),up主: xiaobing1016
前言:
GCC 編譯器支持編譯 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序;
Linux ?開發(fā)C/C++ 一定要熟悉 GCC
VSCode是通過調(diào)用GCC編譯器來實(shí)現(xiàn)C/C++的編譯工作的;
實(shí)際使用中:
使用 gcc 指令編譯 C 代碼
使用 g++指令編譯 C++ 代碼
3.1 編譯過程
預(yù)處理-Pre-Processing ? ? ? ? ? ? ? //.i文件
2g++??-E??test.cpp??-o??test.i????//.i文件
編譯-Compiling ? ? ? ? ? ? ? ? ? ? ? ?// .s文件
2#??g++?產(chǎn)生的匯編語言文件的缺省擴(kuò)展名是?.s?
3g++??-S??test.i??-o???test.s
匯編-Assembling ? ? ? ? ? ? ? ? ? // .o文件
2#?缺省時(shí) g++?建立的目標(biāo)代碼文件有一個(gè) .o 的擴(kuò)展名。
3g++??-c??test.s??-o??test.o
鏈接-Linking ? ? ? ? ? ? ? ? ? ? ? // bin文件
2g++??test.o??-o??test
3.2 g++重要編譯參數(shù)
-g ? ? 編譯帶調(diào)試信息的可執(zhí)行文件
2
3#?產(chǎn)生帶調(diào)試信息的可執(zhí)行文件test
4g++?-g?test.cpp
-O[n] ? ?優(yōu)化源代碼
2
3#?-O 選項(xiàng)告訴 g++?對(duì)源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)行的更快。?-O2 選項(xiàng)告訴 g++?產(chǎn)生盡可能小和盡可能快的代碼。?如-O2,-O3,-On(n 常為0–3)
4#?-O?同時(shí)減小代碼的長度和執(zhí)行時(shí)間,其效果等價(jià)于-O1
5#?-O0?表示不做優(yōu)化
6#?-O1?為默認(rèn)優(yōu)化
7#?-O2 除了完成-O1的優(yōu)化之外,還進(jìn)行一些額外的調(diào)整工作,如指令調(diào)整等。
8#?-O3 則包括循環(huán)展開和其他一些與處理特性相關(guān)的優(yōu)化工作。
9#?選項(xiàng)將使編譯的速度比使用?-O 時(shí)慢,?但通常產(chǎn)生的代碼執(zhí)行速度會(huì)更快。
10
11#?使用?-O2優(yōu)化源代碼,并輸出可執(zhí)行文件
12g++?-O2?test.cpp
-l ?和 ?-L ? ? 指定庫文件 ?| ?指定庫文件路徑
2#?在/lib和/usr/lib和/usr/local/lib里的庫直接用-l參數(shù)就能鏈接
3
4#?鏈接glog庫
5g++?-lglog?test.cpp
6
7#?如果庫文件沒放在上面三個(gè)目錄里,需要使用-L參數(shù)(大寫)指定庫文件所在目錄
8#?-L參數(shù)跟著的是庫文件所在的目錄名
9
10#?鏈接mytest庫,libmytest.so在/home/bing/mytestlibfolder目錄下
11g++?-L/home/bing/mytestlibfolder?-lmytest?test.cpp
-I ? ?指定頭文件搜索目錄
2#?/usr/include目錄一般是不用指定的,gcc知道去那里找,但?是如果頭文件不在/usr/icnclude里我們就要用-I參數(shù)指定了,比如頭文件放在/myinclude目錄里,那編譯命令行就要加上-I/myinclude 參數(shù)了,如果不加你會(huì)得到一個(gè)”xxxx.h: No such file or directory”的錯(cuò)誤。-I參數(shù)可以用相對(duì)路徑,比如頭文件在當(dāng)前?目錄,可以用-I.來指定。上面我們提到的–cflags參數(shù)就是用來生成-I參數(shù)的。
3
4g++?-I/myinclude?test.cpp
-Wall ? ?打印警告信息
2g++?-Wall?test.cpp
-w ? ?關(guān)閉警告信息
2g++?-w?test.cpp
-std=c++11 ? ?設(shè)置編譯標(biāo)準(zhǔn)
2g++?-std=c++11?test.cpp
-o ? ? 指定輸出文件名
2
3#?指定輸出可執(zhí)行文件名為test
4g++?test.cpp?-o?test
-D ? ? 定義宏
2
3#?常用場(chǎng)景:
4#?-DDEBUG?定義DEBUG宏,可能文件中有DEBUG宏部分的相關(guān)信息,用個(gè)DDEBUG來選擇開啟或關(guān)閉DEBUG
示例代碼:
1//?-Dname?定義宏name,默認(rèn)定義內(nèi)容為字符串“1”2
3#include?
4
5int?main() 6{
7????#ifdef?DEBUG
8????????printf("DEBUG?LOG\n");
9????#endif
10????????printf("in\n");
11}
12
13//?1.?在編譯的時(shí)候,使用gcc?-DDEBUG?main.cpp
14//?2.?第七行代碼可以被執(zhí)行
注:使用 man gcc命令可以查看gcc英文使用手冊(cè)
3.3 【實(shí)戰(zhàn)】g++命令行編譯
案例:最初目錄結(jié)構(gòu): 2 directories, 3 files
1#?最初目錄結(jié)構(gòu)2.
3├──?include
4│???└──?Swap.h
5├──?main.cpp
6└──?src
7????└──?Swap.cpp
8
92?directories,?3?files
3.3.1 直接編譯
最簡(jiǎn)單的編譯,并運(yùn)行
1#?將?main.cpp?src/Swap.cpp?編譯為可執(zhí)行文件2g++?main.cpp?src/Swap.cpp?-Iinclude
3#?運(yùn)行a.out
4./a.out
增加參數(shù)編譯,并運(yùn)行
1#?將?main.cpp?src/Swap.cpp?編譯為可執(zhí)行文件?附帶一堆參數(shù)2g++?main.cpp?src/Swap.cpp?-Iinclude?-std=c++11?-O2?-Wall?-o?b.out
3#?運(yùn)行?b.out
4./b.out
3.3.2 生成庫文件并編譯
鏈接靜態(tài)庫生成可執(zhí)行文件①:
1##?進(jìn)入src目錄下2$cd?src
3
4#?匯編,生成Swap.o文件
5g++?Swap.cpp?-c?-I../include
6#?生成靜態(tài)庫libSwap.a
7ar?rs?libSwap.a?Swap.o
8
9##?回到上級(jí)目錄
10$cd?..
11
12#?鏈接,生成可執(zhí)行文件:staticmain
13g++?main.cpp?-Iinclude?-Lsrc?-lSwap?-o?staticmain
鏈接動(dòng)態(tài)庫生成可執(zhí)行文件②:
1##?進(jìn)入src目錄下2$cd?src
3
4#?生成動(dòng)態(tài)庫libSwap.so
5g++?Swap.cpp?-I../include?-fPIC?-shared?-o?libSwap.so
6##?上面命令等價(jià)于以下兩條命令
7#?gcc?Swap.cpp?-I../include?-c?-fPIC
8#?gcc?-shared?-o?libSwap.so?Swap.o
9
10##?回到上級(jí)目錄
11$cd?..
12
13#?鏈接,生成可執(zhí)行文件:sharemain
14g++?main.cpp?-Iinclude?-Lsrc?-lSwap?-o?sharemain
編譯完成后的目錄結(jié)構(gòu)
最終目錄結(jié)構(gòu):2 directories, 8 files
1#?最終目錄結(jié)構(gòu)2.
3├──?include
4│???└──?Swap.h
5├──?main.cpp
6├──?sharemain
7├──?src
8│???├──?libSwap.a
9│???├──?libSwap.so
10│???├──?Swap.cpp
11│???└──?Swap.o
12└──?staticmain
13
142?directories,?8?files
3.3.3 運(yùn)行可執(zhí)行文件
運(yùn)行可執(zhí)行文件①
1#?運(yùn)行可執(zhí)行文件2./staticmain
運(yùn)行可執(zhí)行文件②
1#?運(yùn)行可執(zhí)行文件2LD_LIBRARY_PATH=src?./sharemain
END
掃碼關(guān)注公眾號(hào)
微信號(hào) : iVSCode
bilibili? : xiaobing1016
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在C#2.0中使用Nullable可空类
- 下一篇: s3c2440移植MQTT