• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0
            本文轉自:http://blog.csdn.net/lee353086/article/details/5864939

            LinuxC++程序常用編譯命令


            文中涉及的命令在
            Ubuntu8.04.1中測試通過,本文的目的是為了以后要用的時候,只要看一下本文就馬上能回憶起這此命令怎么用。

            生成目標文件

            #gcc –c <XXX.cpp>

            可以有多個cpp文件

            編譯靜態庫

            #ar cr   <libXXX.a>   <XXX.o> 

            可以有多個o文件(目標文件)

            靜態庫名的命名方式應該是libXXX.a 其中XXX是庫的名字。

            編譯成動態庫

            # gcc -shared -fPCI -o libmyhello.so hello.o

            可以有多個o文件,若考慮到同個庫有多個版本,參考如下命令

            #gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o

            另外再建立兩個符號連接:

            #ln -s libhello.so.1.0 libhello.so.1

            #ln -s libhello.so.1 libhello.so 這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc -shared 參數使其生成是動態庫而不是普通執行程序。

            -Wl 表示后面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正 在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有 soname名字的文件,而不是庫的文件名,換句話說,soname是庫的區分標志。 這樣做的目的主要是允許系統中多個版本的庫文件共存,習慣上在命名庫文件的時候通常與soname相同 libxxxx.so.major.minor 其中,xxxx是庫的名字,major是主版本號,minor 是次版本號

            使用靜態庫

            #gcc –o <輸出文件名> <目標文件名> <靜態庫文件名>

            使用動態庫

            #gcc  <源文件名>  -l<動態庫文件名>  -L<動態庫所在路徑>

            例如:

            #gcc test.c -lhello -L.

            把源test.c編譯為a.out可執行文件,test.c所需要的函數在libhello.so文件中定義,libhello.so文件在當前目錄。

            直接執行a.out提示找不到動態庫文件,這時需要修改當前的動態庫搜索路徑。

            如下:

            # export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

            再執行a.out,測試文件運行成功。

            常用命令

            [1]查看當前文件依賴于哪些庫

            #ldd   <庫文件或可執行文件>

            [2]查看文件類型

            #file  <可執行文件名>

            [3]查看庫中符號

            #nm <庫文件名稱>

            nm列出的符號有很多,常見的有 三種,一種是在庫中被調用,但并沒有在庫中定義(表明需要其他庫支持),用U表示;一種是庫中定義的函數,用T表示,這是最常見的;另外一種是所謂的“弱 態”符號,它們雖然在庫中被定義,但是可能被其他庫中的同名符號覆蓋,用W表示。

            通常和grep命令配合使用

            可執行程序在執行的時候如何定位共享庫文件

            采用以下順序 

            [搜索elf文件的 DT_RPATH]=>

            [ 環境變量LD_LIBRARY_PATH]=>

            [/etc/ld.so.cache文件列表]=>

            [/lib/,/usr/lib目錄]

            如何讓執行程序順利找到動態庫

            [方法一]把庫文件copy/usr/lib目錄或/lib目錄。

            [方法二]修改當前終端的LD_LIBRARY_PATH環境變量,例如:

            #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/WhereIsMyLibLocation

            此方法只能臨時改變搜索路徑

            [方法三]修改/etc/ld.so.conf文件,把庫所在的路徑加到文件末尾,并執行ldconfig刷新。這樣,加入的目錄下的所有庫文件都可見。

            常用參數(速記)

            -I<頭文件路徑 -L<庫文件路徑> -i<頭文件 -l<庫文件名>

            -Wall   盡可能多的警告信息

            -o     輸出可執行文件名(起到重命名輸出文件名的作用)

            比如說用gcc編譯C++文件需要加上-lstdc++參數,讓編譯器去找libstdc++.a靜態庫文件


            posted on 2012-06-07 10:55 王海光 閱讀(560) 評論(0)  編輯 收藏 引用 所屬分類: Linux
            国产精品久久亚洲不卡动漫| 伊人久久大香线蕉影院95| 无码8090精品久久一区| 色婷婷久久综合中文久久一本| 久久天天躁狠狠躁夜夜av浪潮 | 香港aa三级久久三级老师2021国产三级精品三级在 | 一本伊大人香蕉久久网手机| 国产精品va久久久久久久| 久久国产一片免费观看| 久久亚洲AV无码精品色午夜| 2022年国产精品久久久久| 久久这里只有精品视频99| 麻豆成人久久精品二区三区免费| 91精品国产91久久久久久蜜臀| 日批日出水久久亚洲精品tv| 久久久久久亚洲精品成人| 久久久不卡国产精品一区二区| 久久综合给久久狠狠97色| 久久93精品国产91久久综合| 亚洲级αV无码毛片久久精品 | 性做久久久久久久久老女人| 久久久av波多野一区二区| 色综合久久久久综合99| 国产∨亚洲V天堂无码久久久| 亚洲精品久久久www| 国内精品久久久久国产盗摄| 99国产精品久久久久久久成人热| 热99RE久久精品这里都是精品免费| 91精品国产91久久久久久青草| 奇米综合四色77777久久| 亚洲精品无码久久久久AV麻豆| 国产精品免费久久| 久久se精品一区二区| 人妻精品久久无码区| 亚洲αv久久久噜噜噜噜噜| 久久九九兔免费精品6| 久久免费看黄a级毛片| 久久精品免费一区二区| 久久99精品国产麻豆宅宅| 伊人久久大香线蕉综合Av| 亚洲精品高清国产一线久久|