2011-02-03 63 views
5

我在爲兩者構建兩個庫和測試程序時偶然發現了一個看似簡單的問題。靜態庫和SCons的傳遞依賴關係

問題:我有兩個靜態庫,libA和libB,而libB依賴於libA。我不想明確地將所有使用libB的程序鏈接到libA,我希望SCons發現如果程序鏈接到庫B,它也應該鏈接到庫A.

我已經建立了一個簡單的例子來說明這個問題。因爲我無法找到合適的文件託管服務提供商並這是編程有關,我創建了一個小型SVN倉庫:

svn checkout https://example-repository.googlecode.com/svn/trunk example-repository 

,或者你可以下載一個壓縮文件here

回答

4

SCons並不支持表達傳遞庫依賴關係,但它的年輕表弟Waf確實如此。 Waf書中的「使用」功能見documentationBoost build system也有這個功能under a different name。如果你願意編碼一點Python,你也可以選擇在SCons中自己實現它。

您可以使用的一個技巧是將回調定義爲構造變量(即將通過Python函數調用擴展的字符串)的能力。讓函數調用根據您在解析時計算的某種形式的依賴關係圖(即通過SConscript中的方法調用)計算您需要的庫的傳遞列表,並且不必爲每個目標重複完整的庫列表或環境。

+0

+1有趣的鏈接!我會檢查一下waf手冊,但從我看到的情況來看,這可能是一個不錯的選擇。另一方面,我已經開始使用SCons實現一些自定義構建器... – hochl 2011-02-11 09:35:42

0

什麼是libB和libA?他們的庫是一個大的.o還是由幾個.o文件組成?

如果libs是多個.o文件,並且您正在使用libA的.o文件之一調用libB的.o文件中的函數,那麼您將獲得libB的.o和相關的libA .o。如果您在libB .o中使用的函數不依賴於libA中的任何內容,那麼您只能在二進制文件中獲得libB .o文件。

因此,如果你有以下命令:

cc -o a.out a.c libA.a libB.a 

你只會得到來自libB和利巴所需要的零件。

+0

它們只包含簡單的對象文件,可以在示例tarball中看到(請參閱發佈結束時的鏈接)。 – hochl 2011-02-03 17:26:09