Без рубрики

Компиляция Poppler + Qt5 в Windows на MinGW

Poppler  — библиотека для работы с PDF файлами для Linux, Windows, Mac.

[tip]

Готовая к употреблению сборка здесь: http://sourceforge.net/projects/poppler-win32/

[/tip]

HOW-TO по компиляции.

Для начала, скачаем всё необходимое

Распаковываем архивы.

Для удобства, основной путь у меня такой: C:\Qt\Projects\poppler  и в дальнейшем я отталкиваюсь именно от этой папки.

Архивы распаковываем в папку tools, каждый в отдельную папочку.

Так же для компиляции нам понадобится CMake, MinGW  устанавливать «по умолчанию»

MinGW можно использовать тот, что идёт вместе с QT либо ту же версию, что и при ручной сборке QT.

Так же потребуются исходники QT (Отмечать галку при установке)

Возьмём с Гита сам poppler:

Открываем консольку и переходим в директорию для загрузки.

[cce lang=»bash»] cd C:\Qt\Projects\poppler
git clone git://anongit.freedesktop.org/poppler/poppler
[/cce]

Ждём окончания загрузки.

Добавим необходимые пути в PATH

[cce lang=»bash»] set PATH=C:\MinGw\bin\;%PATH%
set PATH=C:\Qt\Qt5.1.0\qt5\qtbase\bin;%PATH%
[/cce]

Cкомпилируем сначала OpenJpeg     Если Вы качали по ссылке выше, то в архиве уже скомпилированная версия.

[cce lang=»bash»] cd  C:\Qt\Projects\poppler\tools\openjpeg
cmake -G «MinGW Makefiles»  C:\Qt\Projects\poppler\tools\openjpeg
mingw32-make
[/cce]

Дальше создадим файлик c переменными, чтобы cmake знал где искать библиотеки.

Файл c:\Qt\projects\poppler\init.txt

[cce lang=»bash»]

##############################################################################
SET(FREETYPE_LIBRARY «C:\Qt\Projects\poppler\tools\freetype\lib\freetype.lib» CACHE PATH «» FORCE)
SET(FREETYPE_INCLUDE_DIR_ft2build «C:\Qt\Projects\poppler\tools\freetype\include» CACHE PATH «» FORCE)
SET(FREETYPE_INCLUDE_DIR_freetype2 «C:\Qt\Projects\poppler\tools\freetype\include\freetype2» CACHE PATH «» FORCE)
SET(FREETYPE_INCLUDE_DIRS «C:\Qt\Projects\poppler\tools\freetype\include» CACHE PATH «» FORCE)

SET(CAIRO_INCLUDE_DIRS «C:\Qt\Projects\poppler\tools\cairo\include\cairo» CACHE PATH «» FORCE)
SET(CAIRO_LIBRARIES «C:\Qt\Projects\poppler\tools\cairo\lib\cairo.lib» CACHE PATH «» FORCE)

SET(LIBOPENJPEG_INCLUDE_DIR «C:\Qt\Projects\poppler\tools\openjpeg\include\openjpeg-1.5» CACHE PATH «» FORCE)
SET(LIBOPENJPEG_LIBRARIES «C:\Qt\Projects\poppler\tools\openjpeg\lib\openjpeg.lib» CACHE PATH «» FORCE)
SET(ZLIB_INCLUDE_DIR «C:\Qt\Projects\poppler\tools\zlib\include» CACHE PATH «» FORCE)
SET(ZLIB_LIBRARY «C:\Qt\Projects\poppler\tools\zlib\lib\zdll.lib» CACHE PATH «» FORCE)

SET(WITH_Iconv OFF CACHE BOOl «» FORCE)
SET(WITH_PNG OFF CACHE BOOl «» FORCE)
SET(WITH_GLIB OFF CACHE BOOl «» FORCE)

[/cce]

Ну и скомпилируем сам Poppler

[cce lang=»bash»] cd  C:\Qt\Projects\poppler\poppler\
cmake  -C «C:\Qt\Projects\poppler\init.txt» -G «MinGW Makefiles»  c:\Qt\projects\poppler\poppler
mingw32-make
[/cce]

Должно всё пройти нормально…

Подключение: 

В файле .pro проекта прописать

[cce lang=»c++»] INCLUDEPATH += C:/Qt/Projects/poppler/poppler/qt5/src/
>LIBS += -LC:/Qt/Projects/poppler/poppler/qt5/src/ -llibpoppler-qt5
[/cce] Ну и в коде не забыть [cce lang=»c++»] #include <poppler-qt5.h>
[/cce]

Кстати, библиотеку libpoppler.dll и libpoppler-qt5.dll надо кинуть к экзешнику проги.

Примеры будут позже отдельным топиком.

[tip]

Может ругаться на файл  gfile.cc,  строку 603 и еще парочку (LARGE_INTEGER), надо просто обернуть значение в {фигурные скобки}

Так же ругнётся на «Нет декларации GetFileSizeEx«, в верху файла, после комментов вписать:

#define _WIN32_WINNT 0x0501
#include <windows.h>

[/tip] [tip]

Не может найти fontconfig.h ?

Качаем Fontconfig открываем архив и копируем папку include/fontconfig   в   C:\Qt\Projects\poppler\tools\cairo\include\cairo\

[/tip] [tip]

Будет ругаться «нет декларации в этой области видимости <sleep>» заменить на MyThread::msleep и выше функции прописать struct MyThread : public QThread { using QThread::msleep;};

[/tip]

24 комментария

Khusrav 28 сентября 2017 - 16:37
Спасибо, сейчас попробую ну если бы был с картинками или видео урок ещё хорошо будет
Evgeniy 9 января 2015 - 1:08
Доброго времени суток. Спасибо за инструкцию, всё получилось. На выходе получил файлы libpoppler.dll и libpoppler.dll.a. Но я всё не могу подключить в проект библиотеку. Без lib файла никак не получается... Если Вас не затруднит, не могли бы тестовый проект выложить с скомпилированными библиотеками, которые на sourceforge выложены. Или может быть есть инструкция как с помощью visual studio собрать можно? Заранее большое спасибо!
Pavelk 11 января 2015 - 2:35

Доброго.

К сожалению, тестового не осталось. 

А что именно не получается? Я так понимаю Вы подключаете в Visual Studio ?

Evgeniy 11 января 2015 - 23:04
В идеале конечно хочется в студии подключить, но пока пробую в QtCreator. Пробовал по разному, далее конкретно по пунктикам:   1. При подключении библиотеки с прямым указанием файла (LIBS += C:/Qt/Projects/poppler/bin/libpoppler-qt5.dll) в LIBS компилятор выдаёт ошибку: C:\Qt\Projects\poppler\bin\libpoppler-qt5.dll:-1: ошибка: LNK1107: invalid or corrupt file: cannot read at 0x448. 2. При указании через -l(LIBS += -LC:/Qt/Projects/poppler/lib/-llibpoppler-qt5) ругается линковщик: mainwindow.obj:-1: ошибка: LNK2019: unresolved external symbol "__declspec(dllimport) public: static class Poppler::Document * __cdecl Poppler::Document::load(class QString const &,class QByteArray const &,class QByteArray const &)" (__imp_?load@Document@Poppler@@SAPAV12@ABVQString@@ABVQByteArray@@1@Z) referenced in function "public: __thiscall MainWindow::MainWindow(class QWidget *)" (??0MainWindow@@QAE@PAVQWidget@@@Z) Ругается на строчку: Poppler::Document*doc=Poppler::Document::load("1.pdf");   Работаю под Win8.1, Qt5.2.0 win32, компилятор от 12 студии. Может проблема в том, что Poppler собран с помощью MinGW, а я подключаю её в проект, который собирается студийным компилятором?  Если честно уже и не знаю что делать. Все праздники пробовал.  P.S. С наступившими всех праздниками!!!
Evgeniy 11 января 2015 - 23:06
Что-то я накосячил с форматированием...
Pavelk 12 января 2015 - 0:10

Поэтому и спрашивал =) Да, дело в разных компиляторах.

 

Evgeniy 12 января 2015 - 13:07
А не подскажите, возможно ли poppler собрать студийным компилятором?
Evgeniy 13 января 2015 - 22:59
Как оказалось всё довольно просто, нужно было только почитать help по cmake/ CMake позволяет создавать файлы для различных компиляторов, в том числе и для visual studio.  Необходимо было на последнем этапе выполнить команду: cmake  -C "C:\Qt\Projects\poppler\init.txt" -G "Visual Studio 11 2012"  c:\Qt\projects\poppler\poppler После этого создаются файлы проектов и solution для 12 студии. Открываем solution и делаем rebuild. На выходе получаем dll и lib файлы.
Feel 27 октября 2014 - 16:56
Решил подключить опять Poppler и при компиляции на 99 % после Building CXX 0bject test/CMAkeFiles/perf-test.dir/perf-test.cc.obj     Далее вот такого рода ошибка :   c:\Qt\Projects\poppler\poppler\test\perf-test.cc:329:58: error new declaration 'void strcpy_s<char*,size_t,const char*)'    void strcpy_s<char* dst,size_t dst_size, const char* src).   Раньше  компилилось нормально.
Денис 28 июля 2014 - 19:21
Здравствуйте!) эт снова я ) хотел спросить, вроде все собрал до 100 % дошло, подключил к проекту как у вас написано, добавил #include<poppler-qt5.h> , в конструкторе набрасал одну строку Poppler::Document*doc=Poppler::Document::load("path.pdf");   но при сборке ругается на эту строку , такие ошибки:     undefined reference to'_imp_ZN7Poppler8Document4loadERK7QStringRK10QByteArrayS6_'   и  error: id returned 1 exit status              , изменял в gfile.cc  , но без результатно, в чем еще может заключаться ошибка ?    при прописке в файле gfile.cc  строк: #define_WIN32_WINNT 0x0501 и #include <windows.h>, он не пытается собрать библиотеку, прописывал вверху файла как вы и написали, после коментов.  
Pavelk 16 августа 2014 - 18:15

'_imp_ZN7Poppler8Document4loadERK7QStringRK10QByteArrayS6  

Вы скоре всего не подключили саму библиотеку. 

Попробуйте в LIBS +=  прямо указать на файл, напрмере LIBS += C:/libs/popler.dll

Естественно замените путь и имя библиотеки на своё.

Денис 28 июля 2014 - 10:48
спасибо) пойду разбираться)
Денис 27 июля 2014 - 18:18
и еще если уже mingW есть с qt можно же его не ставить ? 
Pavelk 28 июля 2014 - 1:49

Впринципе да.

Денис 27 июля 2014 - 18:16
Скажите путь set PATH=C:\Qt\Qt5.1.0\qt5\qtbase\bin;%PATH% у меня не существует, хотя версию такую же поставил , что вообще вот этот путь значит ?
Pavelk 28 июля 2014 - 1:48

Это значит Вы при установке QT не отметили установку исходников. Придётся переставлять. Там в процессе увидите.

Ivan 30 ноября 2013 - 19:57
Здравствуйте, а вы пробовали скомпилировать на Visual Studio 2010?
Pavelk 3 декабря 2013 - 8:24

Неа.

Diiimka 16 октября 2013 - 10:40
Для windows 7 и qt 5.1.1 У меня он лежит: C:\Qt\Qt5.1.1\Tools\mingw48_32\bin\mingw32-make 1. Добавить в начало файла (не 0x0501 !!!): #define _WIN32_WINNT 0x0502 #include <windows.h> 2. Строка 608: LARGE_INTEGER largeInteger = {{0}}; 3. Строка 619: LARGE_INTEGER size = {{(DWORD)-1,-1}}; 4. далее все как в мануале
Pavelk 16 октября 2013 - 12:14

Спасибо.

Anonymous 30 сентября 2013 - 23:46
А это нормально, что там только .dll и .dll.a файлы, а .lib файлов нет? Я сделал как написано   LIBS += -LC:/Qt/Projects/poppler/poppler/qt5/src/ -llibpoppler-qt5 но он пишет error: LNK1181: cannot open input file 'libpoppler-qt5.lib'   а если писать так: LIBS += C:/Qt/Projects/poppler/poppler/qt5/src/libpoppler-qt5.dll.a то возникают ошибки unresolved external symbol
Pavelk 1 октября 2013 - 1:12

Да, нормально. Только что создал тестовый проект, всё нормально. 

Возможно, ошиблись в путях?

Maksim 1 сентября 2013 - 14:40
Исправте определение определение Linuw -> Linux
Pavelk 1 сентября 2013 - 18:30

Спасибо.

Add Comment