2012-09-18 110 views
0

我有關於Linux上鍊接的以下問題:混合靜態和共享庫時鏈接器的依賴關係

假設我有一個使用Qt的Foo類。要構建這個類,我必須使用qmake來生成Makefile。

後來我想用這個類Foo作爲Perl模塊,它是一個共享庫。但是,爲了構建它,我必須使用Perl的MakeMaker來生成它自己的Makefile。

我現在這樣做的方式是將類Foo創建爲靜態庫,並在構建Perl模塊的共享庫時將其鏈接到Foo的靜態庫。

問題是,當構建Perl模塊的共享庫時,我必須將它鏈接到Foo的靜態庫所鏈接的所有Qt庫。

所以,問題是:

  1. 請問這種做法甚至有意義?

  2. 是否有可能以構建Foo的靜態庫的方式構建Perl模塊的共享庫時不必指定所有依賴關係? (因爲將所有這些依賴添加到模塊的Makefile中有點難)

  3. 如果Foo的庫是共享的,而不是靜態的,它會有什麼不同嗎?

回答

2

1)不能將靜態庫鏈接到共享庫。

2)你不會需要明確鏈接對Foo的依賴性,如果Foo本身是一個DSO

3)您可以輕鬆地修改Makefile.PL LIBS部分添加額外的鏈接器的依賴。

4)無論如何,Qt是靜態鏈接的徹頭徹尾的痛苦。除非你有特定的版本依賴和操作系統/平臺限制,否則你最好只做整個動態版本。提示:即使你確實有一個'靜態'構建的Qt,這個'靜態'構建將不包括它可能決定需要作爲可加載模塊呈現的東西。到過那裏。

5)我相信有CPAN模塊(有點新)提供Qt4綁定。我從來沒有使用過它,不知道它的狀態,但可能值得一試。

但是,你最好的選擇是讓Foo成爲一個充滿活力的圖書館..然後大家都很開心。

+0

是的,我知道。 Qt的靜態鏈接很痛苦。我想我必須堅持使用共享庫。 – JackTheRandom

1

1)這取決於你的目標是什麼。 2)如果是關於最小化構建它的麻煩,你可以將Qt的靜態庫作爲靜態庫包含到你的Foo庫中。重要的是,您在Foo中引用的符號可以在運行時找到。這樣你就不需要在PerlMake中包含Qt庫。

3)如果是關於最小化可執行文件大小,你必須去共享庫。那麼你應該把所有東西都建立爲共享庫。

靜態構建的優點是獨立於目標平臺上已安裝的共享庫,同時具有可執行文件大小膨脹和庫不可重用(缺少加載兩個相同可執行文件所需的更多內存)的缺點。

針對共享進行鏈接具有較小代碼大小的優勢,但同時必須在目標平臺上安裝正確的共享庫。

+0

那麼,最初的問題是讓這些生成Makefiles一起工作的不同方式。 構建靜態版本的Qt可能會有問題。例如,最新版本的Qt不支持QtWebkit的靜態鏈接。 因此,如果我堅持將共享庫構建爲everyhing,我將不得不拖動所有這些依賴關係? – JackTheRandom

+0

據我瞭解你是靜態鏈接Foo,所以最簡單的事情可能是將所有Qt庫添加(靜態鏈接)到你的Foo檔案中。這將導致一個龐大的存檔。 – count0