Libzip zip_dir_add из руководства не объявлен - C/C++

Я новичок в программировании на C/C++, так что учтите это.

Проблема:

При использовании библиотеки libzip некоторые функции, описанные в руководстве говорят, что они не объявляются в области видимости при компиляции. Я прочитал это руководство (извините на французском языке), которое было написан в 2011 году. Он использует разные имена функций (zip_dir_add — это zip_add_dir и т. д.)

Я думаю, что это может быть связано с процессом установки. Или, может быть, я забыл включить некоторые файлы ..

Вот что я сделал до сих пор:

1) установка библиотеки libzip с использованием пакетов Ubuntu следующим образом:

sudo apt-get install libzip-dev libzip2

2) попробовать на простом коде

#include <iostream>
#include <zip.h>

using namespace std;

int main()
{
  struct zip *zip;
  int err(0);

  zip = zip_open("testzip.zip", ZIP_CREATE, &err);
  zip_dir_add(zip, "upld");
  zip_close(zip);

  return 0;
}

Это возвращает: zip_dir_add не был объявлен в этой области

Любая идея, что может быть причиной этого?

Заранее спасибо !


person M0rkHaV    schedule 25.09.2014    source источник
comment
Ну, вы пробовали другой вариант для имени функции?   -  person Lightness Races in Orbit    schedule 25.09.2014
comment
Я сделал, файл скомпилировался, но дал мне пустой файл, как сказано выше.   -  person M0rkHaV    schedule 25.09.2014
comment
Я не вижу нигде выше, где вы это сказали.   -  person Lightness Races in Orbit    schedule 25.09.2014
comment
Извините, я перепутал снизу и сверху. Я имел в виду комментарий к ответу Теджаса Павара. Проблема в том, что когда я читаю документацию, zip_add_dir не упоминается, и когда я его использую, созданный архив пуст.. (Извините, я не могу голосовать за ваши ответы, у меня еще недостаточно репутации)   -  person M0rkHaV    schedule 26.09.2014


Ответы (3)


Ваш вопрос состоит из 2 частей: 1 почему zip_dir_add не компилируется, а в документации предлагается использовать zip_dir_add, поскольку zip_add_dir устарел. Ответ: возможно, вы имеете в виду другую версию кода и другую версию документации. Для перекрестной проверки перейдите по пути включения libZip, откройте zip.h и проверьте zip_dir_add, которого вы не найдете.

Второй вопрос: почему zip_add_dir создает пустой файл архива. Ответ: когда вы добавляете каталог в zip_add_dir, он НЕ добавляет автоматически все файлы (под каталогом) в архив, вам нужно просмотреть каталог и добавить отдельные файлы, используя zip_add.

person Sandeep    schedule 04.12.2014
comment
Ты прав. Так как версия libzip в пакетах ubuntu не соответствует последней. Поскольку я не хотел бросать весь процесс загрузки и компиляции последней версии библиотеки, я использовал старую, и она, наконец, работает нормально. Спасибо ! - person M0rkHaV; 05.12.2014

Вы же сами написали: zip_dir_add на самом деле должно быть zip_add_dir - или я неправильно понял?

РЕДАКТИРОВАТЬ: только что просмотрел библиотеку - действительно существует zip_dir_add, но она внутренняя. Внешне объявленная оболочка — zip_add_dir.

РЕДАКТИРОВАТЬ 2: После еще одного просмотра, на этот раз в ‹zip.h›. Там zip_add_dir помечен как "устаревший", а zip_dir_add кажется подходящим вариантом.

Я боюсь, что ваш компилятор попытается включить zip.h zlib, а не ваш.

Поскольку вы используете Linux (очевидно), я бы порекомендовал переключиться на какую-нибудь более распространенную библиотеку, например упомянутую zlib (которая включает minizip, и это, скорее всего, то, что вам нужно). Читайте здесь!

person St0fF    schedule 25.09.2014
comment
спасибо за Ваш ответ. Скажите, пожалуйста, в чем разница между внутренним и внешним? Имеются ли внутренние связи для функций, используемых внутри библиотеки, чтобы заставить ее работать, и внешние для функций, которые должен использовать конечный пользователь? В таком случае, где я могу найти пользовательскую документацию? - person M0rkHaV; 25.09.2014
comment
@PVC: Да, верно. Что касается документации, вы ссылались на нее в своем вопросе. - person Lightness Races in Orbit; 25.09.2014
comment
Спасибо за ответы. Я знаю, что поставил его, но, как уже было сказано, в документе нет упоминания о zip_add_dir. Я попытаюсь решить это с моей другой ссылкой. Спасибо ! (Извините, я не могу голосовать за ваши ответы, у меня еще недостаточно репутации) - person M0rkHaV; 26.09.2014
comment
Посмотрите на мою следующую правку выше. Если вы не можете проголосовать, вы все равно можете принять ответ, щелкнув этот красивый крючок, чтобы он стал зеленым :) - person St0fF; 27.09.2014
comment
Извините, я только что увидел ваш комментарий и отредактировал. Как я могу проверить, правильно ли называется zip.h? Я знаю, что могу переключиться на другую библиотеку, но меня попросили поработать с этой. Если нет другой возможности, я изменюсь, но я бы не хотел. Я проверил, и я использую версию 0.10, а не 0.11. Я попытался установить 0.11 из tar, представленного на веб-сайте libzip, но не смог этого сделать... Если я удаляю пакеты, всегда чего-то не хватает, а если я их сохраняю, версия 0.11 не используется. Я нажимаю кнопку крючок, когда у меня есть ответ, а не если мне сказали сделать что-то еще: P - person M0rkHaV; 07.10.2014
comment
если ваша специальная zip-библиотека находится в вашем исходном пути, вы должны использовать #include "relative_path_to/zip.h" - использование двойных кавычек делает поиск препроцессора относительно текущего местоположения файла. Использование квадратных скобок заставляет препроцессор сканировать включаемые каталоги в поисках файла. - person St0fF; 08.10.2014
comment
С другой стороны: если тот libzip-dev, который вы установили, действительно является вашим libzip, вы должны найти правильный zip.h-файл и указать путь относительно каталога include вашей системы в скобках. Использование хорошей идеи, скорее всего, предложит автозаполнение для этого. - person St0fF; 08.10.2014

Функция int zip_add_dir(); Попробуйте. Он должен работать.

person Tejas Pawar    schedule 25.09.2014
comment
Я пробовал, но это не работает. ZIP-архив создается, но он пуст в диспетчере архивов, предоставленном Ubuntu. - person M0rkHaV; 25.09.2014
comment
Я столкнулся с точно такой же проблемой. К сожалению, я не могу использовать zip_dir_add, поскольку он представлен в последней версии, и я не могу выполнить обновление, поэтому должен использовать zip_add_dir. Но конечным результатом является то, что он создает zip-файл, но без содержимого. Любые указатели? - person Sandeep; 04.12.2014
comment
Если хотите, я могу дать вам код, который я использую. Это довольно просто, если вы понимаете, какие функции необходимы. - person M0rkHaV; 05.12.2014