考慮以下情形:動態鏈接庫具有依賴性
- 共享庫libA.so,無依賴性。
- 共享庫libB.so,libA.so作爲其依賴項。
我想編譯一個與libB鏈接的二進制文件。 我應該只用libB還是用libA鏈接二進制文件?
是否有任何方法只與直接依賴鏈接,讓從運行時依賴的解決未解決的符號?
我擔心庫libB實現可能會在將來發生變化,引入其他依賴關係(例如libC,libD,libE)。我會遇到問題嗎?
換句話說:
- 力霸文件:a.cpp啊
- libB文件:b.cpp BH
- 主程序文件:main.cpp中
當然, b.cpp包含ah和main.cpp包含bh
編譯命令:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
我應該使用哪波紋管的選擇?
g++ main.cpp -o main -I. -L. -lB
或
g++ main.cpp -o main -I. -L. -lB -lA
我不能使用第一個選項。鏈接器抱怨來自庫libA的未解析符號。但這聽起來有點奇怪。
非常感謝。
- 更新註釋:
當我鏈接的二進制文件,鏈接器將嘗試解決從主和libB所有符號。但是,libB具有來自libA的未定義符號。這就是連接器抱怨的原因。
這就是爲什麼我需要與libA鏈接。 但是我發現了一種方法來忽略來自共享庫的未解析符號。 看起來我應該使用以下命令行來做到這一點:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
看起來它仍然可以使用-rpath
選項。 但是我需要更好地理解它。
使用-Wl,-unresolved-symbols=ignore-in-shared-libs
選項時,有誰知道任何可能的陷阱?
- 更新註釋2:
-rpath
不應該被用於此目的。強制在給定目錄中找到庫是有用的。 -unresolved-symbol
方法看起來好多了。
再次感謝。
我知道這是很久以前,我忘記標記爲已解決。非常感謝您的回答。] – Marcus
謝謝大家的驚人的問題,和一個合適的答案!我有幾乎完全相同的情況。我試圖將openCV共享對象包裝在自定義共享對象中。可以說C.so是我的習慣,所以CV.so就是一些openCV。我已經成功地鏈接了C.so和CV.so,並且我想將一個main.cpp(你可以!)鏈接到C.so,但是除了使用C.so的對象之外,main.cpp使用了一個在CV.so中定義的對象'cv :: Mat'。在這種情況下,main.cpp運行時是否需要鏈接C.so和CV.so?如果有人對此有所瞭解,我很樂意。謝謝! :) –
爲什麼鏈接程序在生成libB.so時不能解析所有需要的libA.so符號? 主應用程序不應鏈接到libA,因爲它應該是透明的,例如,間接由libB屏蔽? – Wilson