对另一个静态库中的静态库方法的未定义引用
Undefined reference to static library methods inside another static library
由于 Cmake 损坏导致无法安装名为 libzippp 的 C++ libzip 包装器后,我决定 compile/link 自己安装它,因为它足够小。
问题是这个库有两个依赖项,zlib
和 libzip
。所以我 Cmaked 这两个并继续使用 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 方法,但这里开始出现错误,因为链接器调用未定义的引用。
未定义的引用来自库内部,它们是对 "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 作为一个简单的编译单元来编译我的程序,我就可以使用该库而不会出现任何链接器错误。
示例如下:
//Compilation works, lib works
$(CC) -o $(EXEC) $(OBJ) libzippp.h libzippp.cpp $(CLFLAG) -lzip -lzlib
作为一个我不是一个非常有经验的程序员,我假设我刚刚创建库失败了。这是我第一次制作需要其他库才能工作的库,我相信我的错误来自这里。
您需要在 -lzip
之前移动 -lzippp
,否则 linker 将不会 link 来自 libzip 的文件:
$(CC) -o $(EXEC) $(OBJ) $(CLFLAG) -lzippp -lzip -lzlib
这就是静态库的工作方式。
由于 Cmake 损坏导致无法安装名为 libzippp 的 C++ libzip 包装器后,我决定 compile/link 自己安装它,因为它足够小。
问题是这个库有两个依赖项,zlib
和 libzip
。所以我 Cmaked 这两个并继续使用 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 方法,但这里开始出现错误,因为链接器调用未定义的引用。
未定义的引用来自库内部,它们是对 "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 作为一个简单的编译单元来编译我的程序,我就可以使用该库而不会出现任何链接器错误。
示例如下:
//Compilation works, lib works
$(CC) -o $(EXEC) $(OBJ) libzippp.h libzippp.cpp $(CLFLAG) -lzip -lzlib
作为一个我不是一个非常有经验的程序员,我假设我刚刚创建库失败了。这是我第一次制作需要其他库才能工作的库,我相信我的错误来自这里。
您需要在 -lzip
之前移动 -lzippp
,否则 linker 将不会 link 来自 libzip 的文件:
$(CC) -o $(EXEC) $(OBJ) $(CLFLAG) -lzippp -lzip -lzlib
这就是静态库的工作方式。