对另一个静态库

时间:2017-04-24 12:14:13

标签: c++ static-libraries linker-errors zlib libzip

由于Cmake损坏而无法安装名为libzippp的C ++ libzip包装器后,我决定自己编译/链接它,因为它足够小。

问题是这个lib有两个依赖项,zliblibzip。所以我对这两个进行了Cmak并使用MinGW(win32)继续制作.a。然后我将我的库链接到我的程序,然后编译它,没有错误。

以下代码:

//lib creation command lines  

    g++ -c libzippp.cpp -o libzippp.o -std=c++11 -lzlib -lzip
    ar rcs libzippp.a libzippp.o

//Programm compilation (simplified)

    $(CC) -o $(EXEC) $(OBJ) $(CLFLAG) -lzip -lzlib -lzippp

之后我尝试执行基本的libzippp方法,但是这里开始出现错误,因为链接器调用了未定义的引用。

未定义的引用来自lib内部,它们是对“Libzip”依赖项的未定义引用

c:/mingw/bin/../lib/gcc/mingw32/5.3.0/.././..
  /libzippp.a(libzippp.o):libzippp.cpp:(.text+0x236e): 
                                        undefined reference to `_imp__zip_fclose'

但是如果我只是使用libzippp编译我的程序作为一个简单的编译单元,我就可以使用lib而不会出现任何链接器错误。

以下示例:

//Compilation works, lib works

    $(CC) -o $(EXEC) $(OBJ) libzippp.h libzippp.cpp $(CLFLAG) -lzip -lzlib

作为一个我不是一个非常有经验的程序员,我假设我刚刚创建了lib。这是我第一次创建需要其他库工作的库,我相信我的错误来自这里。

1 个答案:

答案 0 :(得分:0)

您需要在-lzippp之前移动-lzip,否则链接器将不会链接libzip中的文件:

$(CC) -o $(EXEC) $(OBJ) $(CLFLAG) -lzippp -lzip -lzlib

这就是静态库的工作原理。