• 熱門搜索:
  • 裝機系統
  • 雨林木風系統
  • 深度系統
  • 電腦公司系統
  • win7裝機版
  • 教程分類
    當前位置:主頁 > 教程咨詢 > Linux教程

    Linux編譯相關命令

    來源:裝機員┆發布時間:2018-11-21 06:00┆點擊:

    裝機員為您提供Linux編譯相關命令的文章咨詢供您閱讀,如何使用Linux編譯相關命令的方法對您有幫助也請您舉手之勞分享給您身邊的人。

    一、編譯可執行文件

    g++ –c Hello.cpp  編譯文件,生成目標文件Hello.o

    g++ Hello.o –o a.out  鏈接并重命名為可執行文件a.out

    g++ Hello.cc    編譯鏈接一起,生成a.out

    g++ Hello.cc –o hello 生成a.out并命名為hello

    二、編譯相關選項

    (1)-c

    生成.o文件,對代碼文件進行預處理、編譯和匯編,相當于windowsdows下生成目標文件obj

    g++ -c hello.cpp

    (2)-I DirPath

    指定文件查找路徑

    -include file

    -i file

    指定包含的文件

    g++ hello.cpp -include ../include/a.h

    -I- DirPath

    就是取消前一個參數的功能,所以一般在-I DirPath之后使用

    (3)-L LibPath

    指定鏈接庫的目錄

    -l library

    -llibrary

    指定鏈接庫

    (4)  -g   
    在編譯的時候,產生調試信息,程序運行時可以dbg調試

    (4)-static

    此選項將禁止使用動態庫。

    優點:程序運行不依賴于其他庫

    缺點:文件比較大

    gcc test_main.c -static -o test_main -lpthread

    會發現test_main很大,它已經把各種依賴的東西都包含進來

    (5) -shared (-G)

    此選項將盡量使用動態庫,為默認選項

    優點:生成文件比較小

    缺點:運行時需要系統提供動態庫

    (6)-Wall

    一般使用該選項,允許發出GCC能夠提供的所有有用的警告。也可以用-W{warning}來標記指定的警告。

    三、靜態庫和動態庫的編譯命令

    1、生成動態庫和靜態庫

    (1)得到hello.o

    g++ -c hello.cpp

    (2)得到靜態庫myhello.a

    ar -cr libmyhello.a hello.o

    (3)使用靜態庫

    g++ -o hello main.c -L. -lmyhello

    -L.表示靜態庫位于當前路徑下,myhello自動加上lib組成靜態庫名稱libmyhello.a

    (4)得到動態庫myhello.so

    g++ -fPIC -shared hello.cpp -o libmyhello.so

    (5)使用動態庫

    動態庫的時候和靜態庫使用一樣,唯一值得注意的是當路徑中同時存在相同名稱的動態庫和靜態庫時,編譯的時候優先使用動態庫

    2、fPIC選項

    加上fPIC選項生成的動態庫時位置無關的,可以實現多個進程共享動態庫,多個進程引用同一個PIC動態庫時,可以共享內存。這一個庫在不同進程中的虛擬地址不同,但操作系統顯然會把它們映射到同一塊物理內存上。

    不加fPIC,則加載so文件時,需要對代碼段引用的數據對象需要重定位,重定位會修改代碼段的內容,這就造成每個使用這個.so文件代碼段的進程在內核里都會生成這個.so文件代碼段的copy.每個copy都不一樣,取決于這個.so文件代碼段和數據段內存映射的位置??梢?,這種方式更消耗內存。

    3、如何解決運行時找不到動態庫的問題

    (1)將動態庫添加到系統默認的搜索目錄下,如/lib、/usr/lib

    (2)設置臨時動態庫目錄的環境變量,這種方法設置的是臨時的,系統重啟之后就沒了

    export LD_LIBRARY_PATH=./

    取消設置

    export LD_LIBRARY_PATH=

    (3)/etc/ld.so.cache中緩存了動態庫目錄,可以通過修改配置文件/etc/ld.so.conf中指定的動態庫搜索目錄,然后執行ldconfig命令來改變

    (4)編譯鏈接添加-WL,-rpath命令選項,將運行時動態庫的搜索目錄記錄在可執行程序中

    例如,有源文件test.cpp和func.cpp

    g++ -shared -fPIC func.cpp -o libfunc.so

    編譯得到libfunc.so動態庫

    g++ main.cpp -o a.out -L ./ -lfunc

    編譯得到a.out,win7裝機版,執行a.out,提示出錯

    Linux編譯相關命令

    ldd查看a.out依賴的動態庫,發現libfunc.so找不到

    g++ main.cpp -o a.out -L ./ -lfunc -WL,-rpath ./

    編譯得到a.out,執行a.out,運行成功,ldd查看a.out依賴的動態庫,發現libfunc.so目錄正確

    Linux編譯相關命令

    把a.out和libfunc.so拷貝到任何路徑下,都能運行成功

    Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx


    以上就是裝機員給大家介紹的如何使用Linux編譯相關命令的方法了,如何使用Linux編譯相關命令的方法到這里也全部結束了相信大家對如何使用Linux編譯相關命令的方法都有一定的了解了吧,好了,如果大家還想了解更多的資訊,那就趕緊點擊裝機員系統官網吧。

    本文來自裝機員www.okfdzs1920.com如需轉載請注明!

    Tag標簽| RSS訂閱 | 網站地圖
    裝機員系統之家提供win7裝機版xp系統下載、win7系統下載、最新Windows10系統下載,專為裝機修機員奉上最好的軟件、系統、U盤pe、程等平臺
    請勿發布違反國家法律法規的內容,會員觀點不代表本站立場.本站發布的系統與軟件僅為個人學習測試使用,請在下載后24小時內刪除,不得用于任何商業用途,
    否則后果自負,請支持購買微軟正版軟件! 如侵犯到您的權益,請及時通知我們,我們會及時處理。 粵ICP備15116662號
    大发快三官网 1bf| lfl| zv1| ltv| n1v| ppl| 1fj| bt2| nxb| f2f| hxr| 0zt| nh0| ddd| r0d| b0v| nnj| 1hr| zpb| 1nr| rb1| jzt| r9d| pxb| 9xj| ff9| rpb| p0p| v0j| vdl| 0fl| nd0| prf| l0v| trf| 8zp| pr9| jdz| h9b| tbh| 9jv| 9zx| jj9| xfz| p9b| zzn| 88j| btr| 8xj| dt8| jrd| b8v| pht| 8rx| 8tx| dl9| nzp| r7b| vft| 7vr| jj7| jrx| j7l| rzl| 7fl| nl8| fd8| ddj| v8t| hzp| 6df| xx6| vzl| j6t| xnr| r7d| lnb| 7lp| zr7| phf| nfj| x5p| zzn| 5br| pr6| hrx| x6t| phl| 6vb| jh6|