Re: [問題] 函式庫一問
※ 引述《fantasywater (肝苦人)》之銘言:
: 最近寫 C++ code 常常遇到 Cross Reference 的問題,
: 導致link時跳出 A 需要 B.so , 同時 B 也需要 A.so 的訊息,
: 這時候的解法就是把會 cross reference的部分拆出來獨立成一包 .so檔。
: 回想起寫 Java 的時候,不管如何import package,好像都不會有類似的情形產生。
: 因此想請教一下 C++ share lib 與 Java package 概念的不同,
: 特別是關於為何 Java package 在使用時不會發生 cross reference 的情形 @_@ ?
: 如果有相關的網頁說明可以分享一下嗎,感謝:)
java也會cross-reference
但是java的tools比較聰明...
像ld的作法是每次開一個lib
1. 從lib裡面搜索目前累積的undefined symbol
2. 有找到的話就把symbol拉進來
第二步可能會帶來新的undefined symbol
那現在考慮以下例子...
A.so:
define: do_A() { printf("A\n"); }
use: printf
libc.so:
define: printf, ...(族繁不及備載)
如果link的時候,順序是A.so libc.so 則一切無事
但如果選擇libc.so A.so 就不能link了
原因是A.so需要的printf,雖然剛剛有讀到
可是因為當時沒有人要用,ld看完就把他丟了
比較好的做法就是像你說的一樣,把cross ref的地方移到別的地方
不過有些場合真的難搞,即使GNU那些強者也覺得太麻煩了
所以有了這個option...
-( archives -)
--start-group archives --end-group
link的時候輸入 --start-group libc.so A.so --end-group
(注意這是ld option,gcc不一定能直接看懂)
ld就會反覆搜尋libc.so和A.so,一直跑到他沒有變動為止
當然濫用這個option的話編譯速度就...會像java?XD
另外,java在編譯期並沒有多少link的需求
java不需要知道對方的address,這個是jvm會負責搞定的
他需要的是對方public interface的signature
因此import反而比較像C/C++的#include
java的.class比較像gcc編出來的.o
link的工作全部都丟給jvm在程式跑起來的時候才做
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.243.139
推
01/02 22:09, , 1F
01/02 22:09, 1F
→
01/02 22:10, , 2F
01/02 22:10, 2F
→
01/03 02:48, , 3F
01/03 02:48, 3F
討論串 (同標題文章)