我的問題與this有一點相似,但它與TCL擴展有關。互相依賴的TCL擴展
我在Linux(gcc)上使用C,我有一個包含三個模塊A,B和C的包。模塊A包含函數並且還定義(不僅聲明)全局變量。我將模塊A編譯並鏈接到一個動態庫(libA.so)中。
現在,我想B和C是TCL擴展。兩者都使用A的函數和全局變量,而C也使用B的函數。我做了B和C共享庫(B.so和C.so),但沒有使用「-Wl -soname」。我讓B.so取決於A.so,而C.so沒有用戶依賴關係。雖然這很奇怪,但bot擴展加載並正常工作。這裏,我有什麼(A = libbiddy.so,B = bddscout.so,C = bddscoutIFIP.so):
[email protected]:/usr/lib/bddscout$ ldd *.so
bddscout.so:
linux-gate.so.1 => (0x00177000)
libbiddy.so.1 => /usr/lib/libbiddy.so.1 (0x00eca000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00342000)
/lib/ld-linux.so.2 (0x0061f000)
bddscoutIFIP.so:
linux-gate.so.1 => (0x00fc2000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00c75000)
[email protected]:/usr/lib/bddscout$ wish
% puts $tcl_patchLevel
8.5.8
% load ./bddscout.so
% load ./bddscoutIFIP.so
% info loaded
{./bddscoutIFIP.so Bddscoutifip} {./bddscout.so Bddscout} {{} Tk}
的問題是,一模一樣的包不工作無處不在。在新的計算機擴展名C.so不加載。
[email protected]:/usr/lib/bddscout$ ldd *.so
bddscout.so:
linux-gate.so.1 => (0xb76ef000)
libbiddy.so.1 => /usr/lib/libbiddy.so.1 (0xb76c9000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754d000)
/lib/ld-linux.so.2 (0xb76f0000)
bddscoutIFIP.so:
linux-gate.so.1 => (0xb7780000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e8000)
/lib/ld-linux.so.2 (0xb7781000)
[email protected]:/usr/lib/bddscout$ wish
% puts $tcl_patchLevel
8.5.10
% load ./bddscout.so
% load ./bddscoutIFIP.so
couldn't load file "./bddscoutIFIP.so": ./bddscoutIFIP.so: undefined symbol: biddy_termFalse
報告未定義的符號是A.問題1全局變量之一:是我的做法正確的,因爲它工作在某些系統上?問題2:爲什麼它不適用於新系統?
+1:關於複雜話題的好問題。 –