Неопределенная ссылка на методы статической библиотеки внутри другой статической библиотеки

После неудачной установки 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

Вот как работают статические библиотеки.

Другие вопросы по тегам