Re: [問題] 函式庫一問

看板C_and_CPP作者 (あら~)時間15年前 (2011/01/02 14:58), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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
其實嚴格說來 import 不像 #include 反而像 using namespace
01/02 22:09, 1F

01/02 22:10, , 2F
因為 java 不會因為你沒 import 就找不到 class...
01/02 22:10, 2F

01/03 02:48, , 3F
樓上是對的XD
01/03 02:48, 3F
文章代碼(AID): #1D828PjH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1D828PjH (C_and_CPP)