2012-08-08 65 views
0

過去一天在連接器地獄中處理,並認爲我會把它扔出去,看看有沒有人可以幫助我。未定義的符號,即使有明確的鏈接

我有兩個我正在構建的共享庫:一個叫做「libhttp」,它有一些http協議的幫助函數,它似乎是爲了更好或更差而構建的。第二個叫做「libvpcutil」,它導致了這個問題。它取決於libhttp中的符號,因此我將它與libhttp鏈接起來。以下是編譯指令(從make文件爆炸)與小事情像我個人的路徑OpenSSL的泛型:

g++ -shared -Wl,-soname,libvpcutil.so.1 -o libvpcutil.so.1.0 vpcreg/registry.o \ 
vpcreg/vpcreg2.o dbase/dbase.o dbase/sqlutils.o diaglog/diaglog.o errmsg/errmsg.o \ 
faillib/faillib.o failover/failover.o initerr/init_err.o kmq/kmq.o kmq/publish.o \ 
kthread/kcom.o kthread/kthread.o libobdi/odi_serv.o mutex/mutex.o netserv/netserv.o \ 
newmem/newmem.o rmtstore/avlmem.o rmtstore/rmtstore.o rmtstore/shm_aloc.o \ 
servhand/servhand.o timers/timers.o vpcstamp/vpcstamp.o websql/websql.o types/blob.o \ 
types/hitime.o types/ticks.o types/timestamp.o odasm/odasm.o webvibapi/webvibapi.o \ 
vibusfeed/vibusfeed.o propstore/propstore2.o cardlib/cardlib.o cardlib/sortlist.o \ 
gapi/genapi.o -L/usr/lib/i386-linux-gnu -lm -lrt -lxml2 -lodbc -L/usr/lib/i386-linux-gnu -\ 
lcurl -Wl,-Bsymbolic-functions -Wl,-z,relro \ 
-L/pathtoopenssl/openssl -lssl -lcrypto -lxml2 -lreadline -\ 
lcurses -Wl,-rpath=.:/pathtobin/bin http/libhttp.so.1.0 ../ddldata/ddldata.o 
../cardddl/cardddl.o ../gendata/generic.o 

編譯和連接成功完成。希望您注意到http/libhttp.so.1.0的鏈接步驟。現在

,如果我做一個納米上libhttp.so.1.0,我得到下面的輸出(其中包括):

00015d5a T _ZN12http_cookiesC1Ev 
00015d5a T _ZN12http_cookiesC2Ev 
00015d7e T _ZN12http_cookiesD1Ev 
00015d7e T _ZN12http_cookiesD2Ev 
00011574 T _ZN12http_headers11url_expressERSo 
00011466 T _ZN12http_headers12http_expressERSo 

但是當我做了納米上libvpcutil.so.1.0我得到實質上:

 U _ZN12http_cookiesC1Ev 
    U _ZN12http_cookiesD1Ev 
    U _ZN12http_headers11url_expressERSo 
    U _ZN12http_headers3setEPKcRKSs 
    U _ZN12http_headers3setEPKcS1_ 
    U _ZN12http_headersC1Ev 
    U _ZN12http_headersD1Ev 

我顯然這裏剪斷,但如果我被困這裏是符號在libhttp明確的規定,我反對它鏈接以libvpcutil,但隨後的符號在libvpcutil不確定。這會產生運行時錯誤。

任何人都看到這個問題?

+0

它通常意味着簽名不匹配。檢查函數聲明,實現和調用的源代碼(並將其放在此處,如果需要任何幫助)。 – littleadv 2012-08-08 22:41:42

+0

@littleadv,如果簽名不匹配,則錯誤會在運行時發生,您可以通過查看「nm」輸出來查看它們是否匹配。 – 2012-08-09 08:35:07

+0

@JonathanWakely我相信我們正在尋找不同的東西。在這個問題中,你有兩個'nm'輸出,其中列出了一堆帶有超載參數的函數,並且只有一個與另一個配對。 – littleadv 2012-08-09 08:42:35

回答

1

看起來像預期的行爲。

鏈接到共享庫不像鏈接到一個靜態庫,所需的符號不會被複制到輸出文件中,而只是獲得對運行時仍必須解析的符號的引用。所以這些符號顯示爲Unm顯示是正常的。

什麼是運行時錯誤?這可能意味着在運行時找不到libhttp.so.1.0庫。您應該能夠在libvpcutil.so上運行ldd並在可執行文件上運行以查看它們是否依賴於libhttp.so.1.0以及它們是否找到了正確的。

libhttp.so.1.0是否有soname套件?如果它與文件名不一樣,是否有與soname同名的符號鏈接? (例如,如果soname是libhttp.so.1,則需要符號鏈接libhttp.so.1 -> libhttp.so.1.0)。我還看到您的libhttp.so.1.0位於名爲http的目錄中,但這不在您的RPATH中,因此在運行時不會找到。