2012-07-26 46 views
7

我一直在我的项目中使用libarchive一段时间,它的工作很好,此刻我动态链接到它,所以在Windows上,libarchive.dll文件必须呈现在系统上。 我现在想静态链接到库,所以我不必打扰分发DLL,但我很难实现这一点!使用MinGW静态链接到Windows上的libarchive

目前,我的make文件,我有这样的事情: -Lpath /到// libarchive/-larchive

而这个工作,但它确实一个动态链接。我不知道如何执行静态链接。

我可以在libarchive目录中看到有两个a文件,libarchive.dll.a和libarchive_static.a。我想我想链接到l​​ibarchive_static.a,但我似乎无法指定此操作,make文件中的-larchive_static导致链接器错误。

我的印象是windows下的静态库是lib文件,但是当我构建libarchive时,我没有得到这样的文件类型。

如何从libarchive中创建.lib文件。另外,作为一个额外的问题,a文件和lib文件有什么区别?

更新

静态链接到libarchive,为使您的库的命令应包含:

-Lpath /到// libarchive/-larchive_static

这将链接到libarchive_static。一份文件。但是,您还需要在代码中定义LIBARCHIVE_STATIC。

现在的问题是,libarchive取决于bzip2的库(以及其他),如果你没有对他们有静电积累,你会得到链接错误是这样的:

未定义的参考`BZ2_bzCompressInit “

您需要的依赖库和类似的命令到连接的静电积聚后libarchive命令:

-Lpath /到/的bzip2/-lbzip2

您可以从源代码编译的bzip2,或做简单的方法,并从Gnu32Win项目这里预构建的二进制:http://gnuwin32.sourceforge.net/packages.html

+1

感谢您的注释来定义LIBARCHIVE_STATIC。 – 2017-04-28 12:07:39

回答

3

只是明确添加libarchive_static.a你的链接命令。

gcc -o YourApp.exe $(OBJS) path/to/libarchive_static.a $(OtherLibs) 

“的.lib” 文件从不同的编译器编译器(Borland公司,微软等),名为 “.a” 是从UNIX的ar工具旧的 “档案” 的形式。它现在仅用于捆绑静态库。

目前,在我的make文件中,我有一些东西...... 而这个工作,但它确实一个动态链接

的某文件实际上包含了动态链接的.dll文件的一些代码,而不是libarchive本身。在启动时,分配函数指针并完成动态链接。

+0

刚刚试过这个,我得到链接器错误,说我在库中使用的函数有一个未定义的引用。那意味着什么? – oggmonster 2012-07-26 11:14:22

+3

这意味着libarchive依赖于其他内容。我敢打赌,这些是zlib,libzip2等。你有这些静态版本?获取.a文件并将它们_after_ libarchive_static.a添加到您的构建命令中 – 2012-07-26 11:20:10

+0

是的您是对的,我已经按照更新了我的问题。我会稍后再试,谢谢! – oggmonster 2012-07-26 13:59:12