‘壹’ 如何确定程序调用了动态库或者静态库
可以得出第一个结论:都为静态链接库,有同名函数参与情况下,链接会出现符号多次定义的错误!
两个动态库
再来看看动态链接库,同样的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寤虹珛镄勭獥浣撴斁鍦ㄥ叡浜瀵硅薄涓锛岃繖鍙浠ユ槸瀵硅瘽妗嗘垨鍏朵粬绐椾綋銆