2013-09-11 54 views
1

所以我一直在嘗試了幾天,現在建libarchive,本指南和許多其他線程如下:https://github.com/libarchive/libarchive/wiki/BuildInstructionsCMake-建設的難點靜態庫

我想LZMA,zlib的和bzip2支持靜態庫。我也有這些靜態版本(庫的)

我只是不能讓它正常工作。我曾使用CMAKE爲VS2010和NMAKE生成make文件。有了這兩個選項,事情編譯得很好,但是當我嘗試使用生成的archive_static.lib時,在我的項目中,我得到了大量未解決的外部事件。編譯.dll版本的庫工作時沒有未解決的外部問題,但它開始要求zlib.dll,bzip2.dll等,我沒有和不想使用。

我想我需要用cmake設置一些標誌,但我不知道該怎麼做。

任何幫助,非常感謝。 http://www.libarchive.org/

+0

所以我認爲問題是,archive_static.lib是靜態鏈接是的,但由於某些原因zlib,lzma和bzip2 arent。如果是這種情況,我怎麼能強制這個呢?是否合理,archive_static.lib編譯爲與其他3動態鏈接,即使我沒有可用的DLL ... – ollo

回答

1

我不確定這是否發生在這裏,但請記住,當將二進制文件鏈接到靜態庫時,其外部依賴關係不一定會嵌入到其中,這意味着您可能需要提供你的程序通過libarchive間接依賴的靜態庫,即LZMA,zlib和bzip2。

此外,當涉及到鏈接靜態與動態時,在窗口上存在一些混淆,因爲在這兩種情況下,您都提供了一個.lib文件,因此很容易混合起來並提供動態鏈接的.lib,而不是靜態版本。如果你這樣做了,鏈接器可能會拒絕鏈接你的程序(特別是在boost)的情況下,或者可能鏈接正常,然後在執行時,操作系統將需要相應的.dll文件。

+0

_when將二進制文件鏈接到靜態庫時,它的外部依賴不必嵌入到它_這。如果你在整個構建中使用CMake,它實際上會爲你解決這個問題(即,通過'target_link_libraries'賦予靜態庫的依賴將傳播到鏈接到該庫的所有可執行文件)。 – ComicSansMS

+1

@ComicSansMS肯定,但據我瞭解,OP不會在他使用它的同一個cmake項目中編譯libarchive,所以不幸的是,觀察不適用 – brunocodutra

+0

如果單獨編譯的庫導出CMake包配置文件,它也可以工作。但由於libarchive也不這樣做,你的反對意見仍然存在。 – ComicSansMS