日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

發(fā)布時(shí)間:2023/12/9 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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文件

  • 1#?-E?選項(xiàng)指示編譯器僅對(duì)輸入文件進(jìn)行預(yù)處理
    2g++??-E??test.cpp??-o??test.i????//.i文件
  • 編譯-Compiling ? ? ? ? ? ? ? ? ? ? ? ?// .s文件

  • 1#?-S?編譯選項(xiàng)告訴?g++?在為?C++?代碼產(chǎn)生了匯編語言文件后停止編譯
    2#??g++?產(chǎn)生的匯編語言文件的缺省擴(kuò)展名是?.s?
    3g++??-S??test.i??-o???test.s
  • 匯編-Assembling ? ? ? ? ? ? ? ? ? // .o文件

  • 1#?-c?選項(xiàng)告訴?g++?僅把源代碼編譯為機(jī)器語言的目標(biāo)代碼
    2#?缺省時(shí) g++?建立的目標(biāo)代碼文件有一個(gè) .o 的擴(kuò)展名。
    3g++??-c??test.s??-o??test.o
  • 鏈接-Linking ? ? ? ? ? ? ? ? ? ? ? // bin文件

  • 1#?-o?編譯選項(xiàng)來為將產(chǎn)生的可執(zhí)行文件用指定的文件名
    2g++??test.o??-o??test

    3.2 g++重要編譯參數(shù)

  • -g ? ? 編譯帶調(diào)試信息的可執(zhí)行文件

  • 1#?-g 選項(xiàng)告訴 GCC 產(chǎn)生能被 GNU 調(diào)試器GDB使用的調(diào)試信息,以調(diào)試程序。
    2
    3#?產(chǎn)生帶調(diào)試信息的可執(zhí)行文件test
    4g++?-g?test.cpp
  • -O[n] ? ?優(yōu)化源代碼

  • 1##?所謂優(yōu)化,例如省略掉代碼中從未使用過的變量、直接將常量表達(dá)式用結(jié)果值代替等等,這些操作會(huì)縮減目標(biāo)文件所包含的代碼量,提高最終生成的可執(zhí)行文件的運(yùn)行效率。
    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 ? ? 指定庫文件 ?| ?指定庫文件路徑

  • 1#?-l參數(shù)(小寫)就是用來指定程序要鏈接的庫,-l參數(shù)緊接著就是庫名
    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 ? ?指定頭文件搜索目錄

  • 1#?-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 ? ?打印警告信息

  • 1#?打印出gcc提供的警告信息
    2g++?-Wall?test.cpp
  • -w ? ?關(guān)閉警告信息

  • 1#?關(guān)閉所有警告信息
    2g++?-w?test.cpp
  • -std=c++11 ? ?設(shè)置編譯標(biāo)準(zhǔn)

  • 1#?使用?c++11?標(biāo)準(zhǔn)編譯?test.cpp
    2g++?-std=c++11?test.cpp
  • -o ? ? 指定輸出文件名

  • 1#?指定即將產(chǎn)生的文件名
    2
    3#?指定輸出可執(zhí)行文件名為test
    4g++?test.cpp?-o?test
  • -D ? ? 定義宏

  • 1#?在使用gcc/g++編譯的時(shí)候定義宏
    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。