Неопределенная ссылка на методы статической библиотеки внутри другой статической библиотеки
После неудачной установки C++ libzip-оболочки с именем libzippp из-за сломанного Cmake, я решил скомпилировать / связать его сам, так как он достаточно маленький.
Проблема в том, что эта библиотека имеет две зависимости, zlib
а также libzip
, Поэтому я сделал эти два и приступил к созданию.a, используя MinGW (win32). Затем я связал свою библиотеку с моей программой, а затем скомпилировал ее, без ошибок.
Код ниже:
//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 как простой модуль компиляции, я смогу использовать lib без каких-либо ошибок компоновщика.
Пример ниже:
//Compilation works, lib works
$(CC) -o $(EXEC) $(OBJ) libzippp.h libzippp.cpp $(CLFLAG) -lzip -lzlib
Как я не очень опытный программист, я предположил, что просто не смог создать библиотеку. Это первый раз, когда я делаю библиотеку, для работы которой нужны другие библиотеки, и я верю, что отсюда моя ошибка.
1 ответ
Вы должны двигаться -lzippp
до -lzip
иначе компоновщик не будет связывать файлы из libzip:
$(CC) -o $(EXEC) $(OBJ) $(CLFLAG) -lzippp -lzip -lzlib
Вот как работают статические библиотеки.