青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

第一反應是:居然沒有對應的.so 和.a,dll搜索path居然是編譯階段就定好了。

好吧,都是可以控制的


靜態庫:

 對函數庫的鏈接是放在編譯時期(compile time)完成的。所有相關的對象文件(object file)與牽涉到的函數庫(library)被鏈接合成一個可執行文件(executable file),即將動態庫內容拷貝到自己需要的程序中,所以程序在運行時,與函數庫再無瓜葛,所以這些函數庫被成為靜態庫(static libaray),通常文件名為“libxxx.a”的形式。
 
       在linux環境中, 使用ar命令創建靜態庫文件.如下是命令的選項: 
          d -----從指定的靜態庫文件中刪除文件 
          m -----把文件移動到指定的靜態庫文件中 
          p -----把靜態庫文件中指定的文件輸出到標準輸出 
          q -----快速地把文件追加到靜態庫文件中 
          r -----把文件插入到靜態庫文件中 
          t -----顯示靜態庫文件中文件的列表 
          x -----從靜態庫文件中提取文件 
          還有多個修飾符修改以上基本選項,詳細請man ar 以下列出三個: 
          a -----把新的目標文件(*.o)添加到靜態庫文件中現有文件之后 
          b -----***************************************之前 
          v -----使用詳細模式       ar 命令的命令行格式如下:       ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...      eg:         ar -crs hello.a hello.c
動態庫 :
 庫函數的鏈接載入推遲到程序運行的時期(runtime)。這就是如雷貫耳的動態鏈接庫(dynamic link library)技術。
動態鏈接庫的特點與優勢:
 1. 可以實現進程之間的資源共享。
 某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些“動態鏈接”額外的開銷,卻大大的節省了系統的內存資源。C的標準庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標準庫的代碼段。
 2. 將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級
 3. 甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制。
    所有的函數本著“有需求才調入”的原則,于是大大節省了系統資源。

動態鏈接庫的創建

 由于動態鏈接庫函數的共享特性,它們不會被拷貝到可執行文件中。在編譯的時候,編譯器只會做一些函數名之類的檢查。在程序運行的時候,被調用的動態鏈接庫函數被安置在內存的某個地方,所有調用它的程序將指向這個代碼段。因此,這些代碼必須實用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些對象文件是用來做動態鏈接庫的,所以要用地址不無關代碼(Position Independent Code (PIC))。

對gcc編譯器,只需添加上 -fPIC 標簽,如: 
1.創建共享庫 
     gcc -fPIC -c error.c                
     gcc -fPIC -c errorlog.c
     gcc -shared -o libapue.so error.o errorlog.o 
這樣就創建了共享庫! 
注意到最后一行,-shared 標簽告訴編譯器這是要建立動態鏈接庫。這與靜態鏈接庫的建立很不一樣,后者用的是 ar 命令。也注意到,動態鏈接庫的名字形式為 “libxxx.so” 后綴名為 “.so”

2.編譯共享庫 
   
 使用動態鏈接庫,首先需要在編譯期間讓編譯器檢查一些語法與定義。

 這與靜態庫的實用基本一樣,用的是 -Lpath 和 -lxxx 標簽。如:

 gcc file1.o file2.o -Lpath -lxxx -o program.exe

 編譯器會先在path文件夾下搜索libxxx.so文件,如果沒有找到,繼續搜索libxxx.a(靜態庫)。

 在程序運行期間,也需要告訴系統去哪里找你的動態鏈接庫文件。在UNIX下是通過定義名為 LD_LIBRARY_PATH 的環境變量 來實現的。只需將path賦值給此變量即可。csh 命令為:

 setenv LD_LIBRARY_PATH your/full/path/to/dll

 一切安排妥當后,你可以用 ldd 命令檢查是否連接正常。

 ldd program.exe

 

如何才能讓動態加載器發現庫文件呢?有兩種方法可以解決: 
     LD_LIBRARY_PATH 環境變量  
     /etc/ld.so.conf文件 
    1.環境變量 
       export LD_LIBRARY_PATH="dir$LD_LIBRARY_PATH" 
    2.修改/etc/ld.so.conf文件.位于/etc/ld.so.conf 
一般應用程序的庫文件不與系統庫文件放在同一個目錄下,一般把應用程序的共享庫文件放在/usr/local/lib下,新建一個屬于自己的目錄apue,然后把剛才libapue.so復制過去就行了
同時在/etc/ld.so.conf中新增一行: 
/usr/local/lib/apue

實例分析:
1、動態庫的編譯

下面通過一個例子來介紹如何生成一個動態庫。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。

so_test.h:

#include 
#include

void test_a();
void test_b();
void test_c();


test_a.c:

#include "so_test.h"
void test_a()
{
 printf("this is in test_a.../n");
}


test_b.c:
#include "so_test.h"
void test_b()
{
 printf("this is in test_b.../n");
}

test_a.c:

#include "so_test.h"
void test_c()
{
 printf("this is in test_c.../n");
}

將這幾個文件編譯成一個動態庫:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

2、動態庫的鏈接

在1、中,我們已經成功生成了一個自己的動態鏈接庫libtest.so,下面我們通過一個程序來調用這個庫里的函數。程序的源文件為:test.c。

test.c:

#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;

}

l 將test.c與動態庫libtest.so鏈接生成執行文件test:

$ gcc test.c -L. -ltest -o test

l 測試是否動態連接,如果列出libtest.so,那么應該是連接正常了

$ ldd test

l 執行test,可以看到它是如何調用動態庫中的函數的。
3、編譯參數解析
最主要的是GCC命令行的一個選項:
-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件

l -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

l -L.:表示要連接的庫在當前目錄中

l -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱

l LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。

l 當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。
4、注意

調用動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的頭文件所在目錄 通過 “-I” include進來了,庫所在文件通過 “-L”參數引導,并指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。

  3: 如果出現下列錯誤
          ./test: error while loading shared libraries: libtest.so: cannot open   shared object file: No such file or directory
      解決方法:
       1: export LD_LIBRARY_PATH=DIR:$LD_LIBRARY_PATH 
       2: 修改文件/etc/ld.so.config文件,在末行加上你的庫文件目錄,最后,ldconfig刷新ld.so.cache文件即可。可以用strings命令查看ld.so.cache是否刷新:strings /etc/ld.so.cache | grep print
     
4:   ldd命令查看動態連接庫
            
            linux-gate.so.1 =>  (0xb7f0e000)
            libprint.so => not found
            libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d82000)
            /lib/ld-linux.so.2 (0xb7ef4000)
5 : nm查看程序中有那些符號
      
049f18 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080485cc R _IO_stdin_used
         w _Jv_RegisterClasses
08049f08 d __CTOR_END__
08049f04 d __CTOR_LIST__
08049f10 D __DTOR_END__
08049f0c d __DTOR_LIST__
080485ec r __FRAME_END__
08049f14 d __JCR_END__
08049f14 d __JCR_LIST__
0804a018 A __bss_start
0804a010 D __data_start
08048580 t __do_global_ctors_aux
08048450 t __do_global_dtors_aux

6: strip取出程序中符號
7: strings查看可執行文件中的文本信息

posted on 2014-01-14 19:29 Enic 閱讀(430) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲美女中文字幕| 亚洲综合色婷婷| 亚洲激情一区二区三区| 亚洲婷婷综合久久一本伊一区| 久久九九久精品国产免费直播| 欧美日韩国产小视频| 亚洲激情在线观看| 六月天综合网| 久久久99免费视频| 娇妻被交换粗又大又硬视频欧美| 欧美在线黄色| 午夜精品视频在线观看一区二区| 国产精品大片免费观看| 亚洲一区国产一区| 中文av一区特黄| 国产欧美日韩| 国产精品福利在线观看| 欧美mv日韩mv国产网站| 一区二区亚洲精品| 美女网站久久| 久久久久久久网站| 亚洲激情图片小说视频| 欧美成人资源网| 蜜桃av一区二区三区| 亚洲国产精品传媒在线观看 | 国产在线视频欧美| 久久精品91久久久久久再现| 午夜在线观看免费一区| 好吊视频一区二区三区四区| 久久亚洲不卡| 欧美激情精品久久久| 亚洲人精品午夜在线观看| 亚洲激情第一区| 欧美性色视频在线| 久久久久国产精品www| 欧美成人一二三| 久久久噜噜噜久久| 亚洲人成在线观看| 一二三四社区欧美黄| 国产欧美日韩在线播放| 美女网站在线免费欧美精品| 欧美激情乱人伦| 亚洲欧美日韩综合国产aⅴ| 久久国产精品久久精品国产| 亚洲人成绝费网站色www| 一区二区三区 在线观看视频| 国产欧美日韩综合一区在线播放| 麻豆精品网站| 欧美视频在线免费看| 美女黄网久久| 国产精品久久久久久久午夜| 久久综合伊人77777麻豆| 欧美精品一区二区三区视频| 欧美一区永久视频免费观看| 久久青草久久| 欧美在线视频日韩| 欧美另类高清视频在线| 久久香蕉国产线看观看网| 欧美视频免费| 亚洲盗摄视频| 激情综合激情| 亚洲欧美日韩综合国产aⅴ| 最新69国产成人精品视频免费| 亚洲图片欧洲图片av| 亚洲国产精品久久久久| 亚洲专区在线视频| 99爱精品视频| 麻豆精品91| 久久免费午夜影院| 国产精品欧美在线| 99riav久久精品riav| 亚洲国产清纯| 快she精品国产999| 久久精品国产清自在天天线 | 在线国产精品播放| 亚洲欧美日韩区| 亚洲黄色片网站| 久久www免费人成看片高清| 蜜臀91精品一区二区三区| 亚洲欧美激情在线视频| 欧美日韩高清免费| 欧美国产综合一区二区| 国产精品欧美在线| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国模吧视频一区| 亚洲欧美精品| 亚洲欧美日韩一区| 欧美四级剧情无删版影片| 亚洲精品视频在线| 亚洲美女视频网| 欧美大胆成人| 亚洲免费视频一区二区| 欧美女同视频| 亚洲久久在线| 亚洲视频精品在线| 欧美日韩亚洲91| 一个色综合av| 欧美一区二区精品久久911| 国产精品久久久久aaaa| 亚洲婷婷免费| 欧美一区二区高清| 国产视频一区在线观看| 欧美综合二区| 亚洲第一黄色| 亚洲视频欧美视频| 国产精品毛片一区二区三区| 亚洲综合第一| 久久深夜福利| 亚洲三级网站| 欧美色道久久88综合亚洲精品| 一区二区日本视频| 欧美中文字幕在线视频| 永久久久久久| 欧美精品一卡二卡| 亚洲综合三区| 欧美 日韩 国产一区二区在线视频| 影音先锋亚洲视频| 欧美绝品在线观看成人午夜影视| 一本到12不卡视频在线dvd| 午夜一区不卡| 亚洲国产成人tv| 欧美视频中文字幕在线| 欧美一区二区三区四区在线| 米奇777在线欧美播放| 一本色道久久加勒比精品| 国产农村妇女精品一区二区| 久久夜色精品国产欧美乱极品| 亚洲人在线视频| 欧美一级大片在线观看| 亚洲高清在线观看一区| 欧美日韩综合视频| 久久国产天堂福利天堂| 亚洲精品一区二区三区樱花| 欧美专区一区二区三区| 亚洲人成人一区二区在线观看 | 狠狠色狠狠色综合人人| 欧美成黄导航| 欧美一级大片在线观看| 亚洲国产精品精华液网站| 午夜精品久久久久99热蜜桃导演| 欧美一级免费视频| 久久裸体艺术| 日韩亚洲欧美高清| 久久久99精品免费观看不卡| 一区在线影院| 欧美性猛片xxxx免费看久爱| 久久人人九九| 亚洲欧美激情视频| 亚洲三级影院| 美女黄毛**国产精品啪啪| 亚洲欧美区自拍先锋| 亚洲激情专区| 黄色成人在线网址| 国产精品视频男人的天堂| 欧美精品综合| 欧美aⅴ99久久黑人专区| 欧美一区三区三区高中清蜜桃 | 欧美呦呦网站| 一本色道久久综合亚洲精品高清 | 香蕉免费一区二区三区在线观看| 亚洲精品网站在线播放gif| 国产一区二区三区日韩欧美| 欧美性猛交99久久久久99按摩| 欧美大片免费观看| 久久久久久九九九九| 欧美一级免费视频| 午夜免费久久久久| 亚洲欧美资源在线| 亚洲一区精品视频| 日韩视频永久免费| 亚洲另类在线一区| 亚洲毛片在线| 夜夜嗨网站十八久久| 99精品欧美一区二区三区| 亚洲精品中文字| 亚洲精品日韩一| 妖精视频成人观看www| 一本一本a久久| 亚洲免费在线精品一区| 亚洲男人的天堂在线aⅴ视频| 夜夜躁日日躁狠狠久久88av| 99re8这里有精品热视频免费| 亚洲乱码国产乱码精品精 | 欧美视频官网| 国产精品超碰97尤物18| 国产精品国码视频| 国产精品一区二区在线观看| 国产酒店精品激情| 国产婷婷一区二区| 国内久久视频| 亚洲国产毛片完整版| 亚洲三级国产| 亚洲欧美日韩中文视频| 欧美在线1区| 久久免费视频这里只有精品| 另类专区欧美制服同性| 亚洲电影免费观看高清完整版在线| 亚洲国产另类 国产精品国产免费| 亚洲免费观看视频| 性高湖久久久久久久久|