2015-01-08 95 views
0

假設你有一個共享庫A.so,而另一個共享庫B.so是按照A.so編譯的。換句話說,如何將用戶編譯的共享庫的共享庫鏈接到Debian上的C++應用程序?

ldd B.so 

提到A.so.此外,假設A.so和B.so已經被我自己成功編譯,即它們位於我的主目錄中的某處。

現在,我有一個應用程序應用程序,我想對A.so和B.so進行編譯。因爲A.so包含在B.so中,所以我只想鏈接B.so。

所以,我在兩個不同的linux系統下做了這個。我嘗試了SLES 10 SP2和Debian 7.7.0(基本安裝,該系統沒有什麼特別之處)。在SLES 10 SP2上,這絕對沒有問題。在Debian,我得到像下面這樣的消息:

/usr/bin/ld: /tmp/ccjQFzpo.o: undefined reference to symbol '_ZN2sf7secondsEf' 
A.so: error adding symbols: DSO missing from command line 
collect2: error: ld returned 1 exit status 

A.so例如可以是我編自己一個Qt4函數庫。如果我使用apt-get install來安裝Qt4庫,那麼它可以工作。

我試圖A.so和B.so添加到由

ldconfig -v 

即我已經能夠看到他們在此列表中給出的列表。它不能解決問題。

我錯過了什麼?

回答

1

因爲A.so包含在B.so中,所以我只想鏈接到B.so。

這是誤解,共享庫鏈接時不包含在另一個庫或應用程序中,它們是動態加載的。動態庫與靜態庫的全部目的。它之前爲你工作,因爲鏈接器自動加載所有依賴的庫。

對於debian我相信,因爲wheezy他們改變了DSO鏈接政策 - 依賴共享庫不會自動鏈接,你有當您鏈接您的應用程序(在你的情況下,你必須明確地說A.so列出所有的人和B.so)。詳細信息可以在這裏找到https://wiki.debian.org/ToolChain/DSOLinking

+0

那麼,那麼如何安裝Qt,例如,與突觸,解決了我的問題(對於特定的庫)?我的意思是,如果A.so是libQtCore.so,並且我用突觸安裝了Qt,那麼我只需要鏈接B.so.我沒有收到DSO錯誤消息。 –