libzipを使用してアーカイブのコンテンツをリストするトレーニング用の簡単なプログラムを作成しようとしています(今の目標:)。libzip ソースを使用しています。
.pro ファイル:
QT += widgets
SOURCES += \
main.cpp \
myZip.cpp \
INCLUDEPATH = /path/to/libzip
HEADERS += \
myZip.h \
MCZip.h
#include <QtWidgets>
#include "zip.h"
class myZip : public QDialog
{
public:
myZip(const char* filePath);
private:
QTextEdit *m_fileListView;
QString m_fileList;
QPushButton *m_closeButton;
};
myZip.cpp
#include "my.h"
myZip::myZip(const char* filePath)
{
setFixedSize(400, 400);
m_fileListView = new QTextEdit;
m_closeButton = new QPushButton("Close");
int err = 0;
struct zip *f_zip=NULL;
f_zip = zip_open(filePath, ZIP_CHECKCONS, &err);
if(err != ZIP_ER_OK)
{
QMessageBox::critical(this, "Error", "Cannot open the file!");
return;
}
if(f_zip == NULL)
{
QMessageBox::critical(this, "Error", "File not found");
return;
}
int fileCount = zip_get_num_files(f_zip);
if (fileCount ==-1)
{
QMessageBox::critical(this, "Error", "The archive seems corrupted");
return;
}
qDebug() << QString("There are %1 files in the archive").arg(fileCount);
for (int i = 0; i < fileCount; i++)
{
m_fileList += QString(QString::fromLocal8Bit(zip_get_name(f_zip, i, ZIP_FL_UNCHANGED)) + "\n");
}
zip_close(f_zip);
f_zip = NULL;
m_fileListView->setText(m_fileList);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(m_fileListView);
layout->addWidget(m_closeButton);
setLayout(layout);
QObject::connect(m_closeButton, SIGNAL(clicked()), this, SLOT(close()));
}
main.cpp
#include <QApplication>
#include "MCCover.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString filePath = QFileDialog::getOpenFileName(this, "Open a file", QString(),
"Zip archive (*.zip)");
QByteArray byteArray = filePath.toUtf8();
const char* cFilePath = byteArray.constData();
myZip *fileList = new myZip(cFilePath);
fileList.show();
return app.exec();
}
問題は、コンパイル時に次のメッセージが表示されることです。
symbol(s) not found for architecture x86_64
collect2: ld return exit status
そして、私が持っている出力を見ると
Undefined symbols for architecture x86_64:
"_zip_close", referenced from:
myZip::myZip(char const*)in myZip.o
myZip::myZip(char const*)in myZip.o
"_zip_get_name", referenced from:
myZip::myZip(char const*)in myZip.o
myZip::myZip(char const*)in myZip.o
"_zip_get_num_files", referenced from:
myZip::myZip(char const*)in myZip.o
myZip::myZip(char const*)in myZip.o
"_zip_open", referenced from:
myZip::myZip(char const*)in myZip.o
myZip::myZip(char const*)in myZip.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
問題を解決する方法について何か考えはありますか? 私は解決策を見つけることができませんでした...
情報については、libzip [フランス語] の使用方法に関するこのチュートリアルに従いました: http://slash.developpez.com/tutoriels/c/utilisation-libzip/
構成: OSX Mountain Lion 上の Qt 5.0.0 と clang_64 コンパイラ (デフォルト)
ありがとう
Wデッドプール
PS: コードを適応させる場合、gcc で qt 4.8.1 を使用しても機能しません。