2013-11-01 49 views
1

我正在處理涉及Lua,PhysFS和xml解析器的C++項目。他們每個人都包含一個zlib。在PhysFS和Lua中,它是zlib 1.2.3版,在解析器中它是1.2.5。他們與VS2010的解決方案相同,只是處於不同的領域。建設每個項目的工作正常。但是,VS2010報告鏈接器錯誤說,_ adler32,_ inflate等已被定義,同時建立最終的可執行文件。奇怪的是,當我在兩臺不同的計算機上工作時,一個是抱怨多個聲明,另一個抱怨Lua & xml解析器。與VS2010 Express一起。vaired開源庫中的多個zlib,鏈接器錯誤

我需要一種解決方法來避免此類問題。由於他們維護良好的開源庫,我不喜歡修改他們的源代碼。

如果我將它們編譯爲.dll和.lib,它會起作用嗎?我的理解是,多個zlib聲明仍然在不同的.lib文件中。真的嗎?

謝謝。

+0

這只是一個猜測,但如果你靜態鏈接,不管你如何劃分項目,你都會遇到這些問題。如果你動態鏈接,不同的zlib DLL版本是兼容的(根據公開的功能),所以它應該工作。不知道,但。 – gnobal

+0

如果你是靜態鏈接,你可能會做一些預處理器欺騙,以確保鏈接器爲每個鏈接器獲取正確的功能。但是,最好使用單獨的DLL並根據需要加載它們以避免這種黑客入侵。 – Tawnos

+0

感謝@gnobal。我通過動態鏈接工作。只是很好奇,OS X和iOS如何處理這些東西?就像在Linux中一樣,你不必自己編譯依賴關係,而只需安裝包?謝謝! – stakira

回答

0

解決此問題的一種方法是通過動態鏈接,即預先構建的DLL和相應的lib文件。在lib文件中,只有部分符號(聲明)暴露給使用此DLL的項目。由於zlib符號是隱藏的,因此可以使用多個zlib副本。