【问题标题】:Undefined reference to static library methods inside another static library对另一个静态库中的静态库方法的未定义引用
【发布时间】:2017-04-24 12:14:12
【问题描述】:

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

问题是这个库有两个依赖,zliblibzip。所以我对这两个进行了 Cmake 并继续使用 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

作为一个我不是一个非常有经验的程序员,我认为我只是在创建库时失败了。这是我第一次制作需要其他库才能工作的库,我相信我的错误来自这里。

【问题讨论】:

  • CLFLAG 是一个非常不标准的编译标志名称。最好单独使用CFLAGSLDFLAGS。另外编译libzippp.o时不需要指定库。
  • 我只是没有写我的 LDFLAGS var,因为它只包含树库,我希望它尽可能清晰,我只是忘记了 CLFLAG 末尾的 S。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多