『壹』 如何確定程序調用了動態庫或者靜態庫
可以得出第一個結論:都為靜態鏈接庫,有同名函數參與情況下,鏈接會出現符號多次定義的錯誤!
兩個動態庫
再來看看動態鏈接庫,同樣的libA libB 生成動態鏈接庫
測試主程序不修改 ! 還是為:
這種編譯方式叫做動態庫的隱式調用, 如果你刪除一個libA.so , 運行a.out 會出現不能找到動態庫的錯誤.
這種情況也可以稱為 載入時鏈接! 靜態庫屬於編譯時鏈接!
可以得出第二個結論: 若都為動態庫,並且進行隱式調用,輸出結果和動態庫的順序有關.
再繼續看看動態載入動態庫.
修改測試主程序
同樣可以得出結論,動態鏈接庫如果不加庫連選項 ,函數調用是正確的 加庫路徑,會以庫的路徑順序為主! 左邊覆蓋右邊. 而且當只鏈接其中一個時 也生效
『貳』 C璇璦 鍑芥暟闂棰
涓嶆槸姣忎釜鍑芥暟鍙浠ュ崟鐙緙栬瘧錛岃屾槸浠ユ枃浠朵負鍗曚綅榪涜岀紪璇戱紝濡傛灉浣犵殑鏂囦歡閲屽彧鍖呭惈浜嗕竴涓鍑芥暟錛屽綋鐒跺氨鍙鏈夎繖涓鍑芥暟琚緙栬瘧浜嗭紝榪愯岀殑鏃跺欏繀欏繪槸浠巑ain()鍑芥暟寮濮嬫墽琛岋紝鐩稿綋鍛婅瘔浜嗚$畻鏈鴻繖涓鍥㈡瘺綰跨殑澶村湪鍝鍎匡紝鐒跺悗鏁翠釜綰挎潯灝卞彲浠ョ悊欏轟簡銆
鍦╳in32騫沖彴涓嬶紝鍗曠嫭緙栬瘧鏂囦歡鐢熸垚鐨勬枃浠舵牴鎹璋冪敤鐨勫艦寮忎笉鍚岀О涓哄姩鎬佸簱鎴栬呴潤鎬佸簱錛岄渶瑕佷嬌鐢ㄦ椂闇鍦╩ain()鍑芥暟鐨勬枃浠跺ご鍓嶈繘琛岃皟鐢錛屽垎闅愬紡鍜屾樉寮忚皟鐢ㄤ袱縐嶏紱鍦↙inux騫沖彴涓嬶紝涓昏佹槸浣跨敤gcc鍜宮ake鐨勫弬鏁版潵鎺у埗鍏剁敓鎴愮殑鏄鍚︿負鍗曠嫭緙栬瘧鐨勬枃浠訛紝榪樻槸鍜屽叾浠栨枃浠剁粍鍚堝叡鍚岀紪璇戙
『叄』 linux 動態鏈接庫名稱里的數字代表什麼
Linux操作系統也提供了一種更為方便的動態庫調用方式,也方便了其它程序調用,這種方式與Windows系統的隱式鏈接類似。其動態庫命名方式為「lib*.so.*」。在這個命名方式中,第一個*表示動態鏈接庫的庫名,第二個*通常表示該動態庫的版本號,也可以沒有版本號。在這種調用方式中,需要維護動態鏈接庫的配置文件/etc/ld.so.conf來讓動態鏈接庫為系統所使用,通常將動態鏈接庫所在目錄名追加到動態鏈接庫配置文件中。如具有X window窗口系統發行版該文件中都具有/usr/X11R6/lib,它指向X window窗口系統的動態鏈接庫所在目錄。為了使動態鏈接庫能為系統所共享,還需運行動態鏈接庫的管理命令./sbin/ldconfig。在編譯所引用的動態庫時,可以在gcc採用 ?l或-L選項或直接引用所需的動態鏈接庫方式進行編譯。在Linux裡面,可以採用ldd命令來檢查程序依賴共享庫。
『肆』 鍔ㄦ佸簱鐨勬樉寮忚皟鐢ㄥ拰闅愬紡璋冪敤鐨勫尯鍒
涓ょ嶆柟娉曞逛簬浣犵殑紼嬪簭璋冪敤鍔ㄦ佸簱鏃舵病鏈変換浣曞尯鍒錛屽彧鏄浣犲湪緙栫▼鏃訛紝姝ラゆ槸涓嶄竴鏍風殑銆傛樉寮忚皟鐢ㄩ夯鐑︿簡鐐癸紝浣嗗彲浠ユ病鏈夌浉搴旂殑lib搴擄紱闅愬紡璋冪敤錛屼嬌鐢ㄨ搗鏉ユ瘮杈冪畝鍗曪紝鏈夊嚱鏁扮殑澹版槑灝卞彲浠ヤ簡錛屼絾蹇呴』鏈塴ib搴撱
『伍』 DelphiforLinux涓搴旂敤鍏變韓瀵硅薄搴
1. Delphi for Linux鏄疊orland鍏鍙告帹鍑虹殑鍩轟簬Linux騫沖彴鐨勯潰鍚戝硅薄鐨勫彲瑙嗗寲寮鍙戝伐鍏鳳紝鏄鐩鍓峀inux騫沖彴涓婂緢濂界殑搴旂敤寮鍙戝伐鍏楓侱elphi for Linux涔熺ОKylix錛屽紑鍙戣呯敤Kylix寮鍙慙inux搴旂敤紼嬪簭鏃訛紝鍙鑳戒細浣跨敤鍒癓inux鎿嶄綔緋葷粺鏈韜甯︾殑澶ч噺SO鏂囦歡銆
2. SO鏄涓縐嶇壒孌婄殑榪愯屾枃浠訛紝鍖呭惈鑻ュ共鏂規硶銆佸硅薄鍜岃祫婧愩傚畠涓嶈兘鐩存帴榪愯岋紝浣嗗彲浠ヨ獽ylix搴旂敤紼嬪簭鎴栧叾浠栧彲鎵ц屾枃浠跺姩鎬佽皟鐢ㄣ係O鏂囦歡鎵╁睍鍚嶄負so銆傜紪璇戝墠婧愭枃浠舵墿灞曞悕涓篸pr銆傛湰鏂囨墍涓句緥瀛愬潎鍦≧ed Hat Linux鍙奒ylix鐜澧冧笅璋冭瘯緙栬瘧閫氳繃錛屽苟鍙姝e父榪愯屻
3. SO搴撴枃浠剁殑緇勬垚鍜孠ylix鏍囧噯鍗曞厓鏂囦歡鐨勫唴閮ㄧ粨鏋勫熀鏈鐩稿悓錛屼篃鏈夊0鏄庛佸疄鐜板強鍒濆嬪寲閮ㄥ垎銆傚尯鍒涔嬩竴鍦ㄤ簬SO搴撳彧鏄鍏朵粬紼嬪簭鍙浠ヨ皟鐢ㄧ殑鏂規硶錛堝寘鎷鍑芥暟鍙婅繃紼嬶級闆嗗悎銆傚尯鍒涔嬩簩錛屽簱紼嬪簭浠library鍏抽敭瀛楄岄潪project寮澶村惎鍔ㄥ叾欏圭洰鏂囦歡銆傚簱紼嬪簭鍖呭惈鏈塭xports璇鍙ワ紝鍏跺垪鍑鴻佸悜澶栭儴鎻愪緵鐨勫煎嚭鍑芥暟鍙婅繃紼嬨
4. 鍏變韓瀵硅薄搴撶殑鍒涘緩錛孲O搴撴枃浠剁殑鏋勬垚錛屽嚱鏁伴噸杞斤紝鐗規畩緙栬瘧鎸囦護錛岄噰鐢―elphi for Linux鍒涘緩SO鐨勭紪紼嬭勫垯錛屼嬌鐢ㄥ墠鐨凩inux緋葷粺璁劇疆錛屼互鍙婂湪Delphi for Linux涓鐢ㄩ殣寮忔垨鏄懼紡閾炬帴鏂規硶瑁呭叆鍜屼嬌鐢⊿O鍑芥暟鐨勫熀鏈鏂規硶錛岀粡楠屽強鎶宸э紝騫跺瑰簲鐢⊿O鍙鑳藉嚭鐜扮殑闂棰樿繘琛屼簡鎺㈣ㄥ拰鍒嗘瀽銆
5. 鍏變韓瀵硅薄搴撳熀鏈姒傚康錛氬氫釜Kylix紼嬪簭鎴栧畠鐨勫氫釜鍗曞厓鏂囦歡鍙閫氳繃鎺ュ彛鍏辯敤涓涓猄O搴撴枃浠訛紱鏌愪竴涓狵ylix紼嬪簭鍙閫氳繃澶氫釜鎺ュ彛浣跨敤澶氫釜SO搴撴枃浠訛紝榪欐牱SO鍙樻垚涓縐嶅彲鍏辯敤鐨勮祫婧愶紝瀹炵幇鐪熸g殑璧勬簮鍏變韓錛屽ぇ澶х緝灝忎簡Kylix搴旂敤紼嬪簭鐨勬墽琛屼唬鐮侊紝澧炲己浜嗚蔣浠剁殑鍙閲嶇敤鎬с
6. 灝哠O鏂囦歡浣滀負Kylix搴旂敤紼嬪簭鐨勫叕鍏辮皟鐢ㄦā鍧楄捐℃椂錛岀敱浜庡叾鐙絝嬩簬搴旂敤紼嬪簭錛岃蔣浠跺崌綰ф椂鍙闇淇鏀筍O搴撴枃浠跺強緙栬瘧SO錛屾棤闇鏇存敼鍙婇噸緙栬瘧Kylix搴旂敤涓葷▼搴忋
7. 涓嶄粎鍙浣跨敤Kylix緙栧啓SO搴擄紝榪樺彲浣跨敤C鎴朇++絳夊父鐢ㄨ璦鏉ョ紪鍐欙紝鍙瑕侀伒寰鐗瑰畾鐨勬帴鍙h勮寖銆
8. 鍏變韓瀵硅薄搴撶殑浣跨敤錛孠ylix搴旂敤紼嬪簭浣跨敤SO搴撴椂鍙浠ラ噰鐢ㄤ袱縐嶆柟寮忥紝涓縐嶆槸闅愬紡閾炬帴錛圛mplicit linking錛夛紝涔熺О闈欐佽呭叆錛涘彟涓縐嶆槸鏄懼紡閾炬帴錛圗xplicit Linking錛夛紝涔熺О鍔ㄦ佽呭叆銆
9. 浣跨敤鍓嶇殑緋葷粺璁劇疆錛岃嚜瀹氫箟SO搴撳緩濂藉悗錛孠ylix搴旂敤紼嬪簭璋冪敤鏃朵細鎶ラ敊錛岃繖鏄鍥犱負Kylix鎵句笉鍒版柊寤哄簱銆傚繀欏誨圭郴緇熻繘琛岀浉鍏寵劇疆錛岃繖涓庡湪Delphi for Windows涓浣跨敤DLL搴撲笉鍚屻侱LL搴撳緩濂藉悗鍙闇灝嗙紪璇戝悗鐨凞LL鏂囦歡鏀懼埌Delphi涓葷▼搴忕洰褰曚笅鍗沖彲浣跨敤銆
10. 闅愬紡閾炬帴錛屽疄鐜伴殣寮忛摼鎺ュ苟涓嶉毦錛屽彧闇鍦ㄥ簲鐢ㄧ▼搴忎腑鍔犲叆搴撳嚱鏁扮殑澹版槑璇鍙ュ強搴撶殑external瀹氫箟浠庡彞錛屽垯搴撳嚱鏁板彲浠ュ拰涓鑸灞閮ㄥ嚱鏁頒竴鏍蜂嬌鐢ㄣ
11. 鏄懼紡閾炬帴錛屾樉寮忛摼鎺ユ槸搴旂敤紼嬪簭鍦ㄦ墽琛岃繃紼嬩腑鍙鏍規嵁瀹為檯闇瑕侀殢鏃跺姞杞絊O搴撴枃浠訛紝涔熷彲浠ラ殢鏃跺嵏杞絊O搴撴枃浠訛紝榪樺彲鍦ㄨ繍琛屾椂榪涜孲O搴撶殑鍒囨崲錛岃岃繖浜涙槸闅愬紡閾炬帴鏃犳硶鍋氬埌鐨勩備笌闅愬紡閾炬帴鐩告瘮錛屾樉寮忛摼鎺ュ叿鏈夋洿澶х殑鐏墊椿鎬с
12. 鍦↘ylix涓錛岃佸姩鎬佽呭叆搴撳拰璋冪敤瀵煎嚭鍑芥暟鍙浠ョ敤Delphi浠跨湡浠g爜鎴栬嚜鐒禠inux鏂規硶錛屼笅闈㈠垎鍒浠嬬粛榪欎袱縐嶆柟娉曘
13. SO搴撲腑紿椾綋瀵硅薄鐨勪嬌鐢錛岄櫎浜嗗寘鍚鍑芥暟鍜岃繃紼嬬殑搴撲箣澶栵紝榪樺彲浠ュ皢Kylix寤虹珛鐨勭獥浣撴斁鍦ㄥ叡浜瀵硅薄涓錛岃繖鍙浠ユ槸瀵硅瘽妗嗘垨鍏朵粬紿椾綋銆