Сборка mathgl на окнах

Я новичок в C ++ (раньше был разработчиком Java, где это намного проще...), и мне нужно написать приложение, которое должно отображать некоторые графики и диаграммы. Для этого я хочу использовать библиотеку MathGL. И я узнал, что я должен скомпилировать его сам, чтобы использовать его. Вот что я пытаюсь сделать последние несколько дней...

Я использую Windows с MinGW и CLion IDE. Я начал с извлечения исходного кода MathGL в папку и открытия папки с помощью CLion. Затем я загрузил исходные коды zlib и libpng и установил переменные INCLUDE_DIR в проекте MathGL в соответствующие папки, а PNG_PNG_LIBRARY в png32. Когда я пытаюсь скомпилировать mgl_example через CLion, я получаю следующую ошибку:

In file included from [...]\mathgl-2.3.5.1\src\data_png.cpp:22:0:
[...]/libpng-1.6.29/png.h:361:27: fatal error: pnglibconf.h: No such file or directory
compilation terminated.
mingw32-make.exe[2]: *** [src/CMakeFiles/mgl.dir/data_png.cpp.obj] Error 1
mingw32-make.exe[2]: *** Waiting for unfinished jobs....
src\CMakeFiles\mgl.dir\build.make:465: recipe for target 'src/CMakeFiles/mgl.dir/data_png.cpp.obj' failed
mingw32-make.exe[2]: Leaving directory '[..]/mathgl-2.3.5.1/cmake-build-debug'
mingw32-make.exe[1]: *** [src/CMakeFiles/mgl.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2
CMakeFiles\Makefile2:89: recipe for target 'src/CMakeFiles/mgl.dir/all' failed
mingw32-make.exe[1]: Leaving directory '[...]/mathgl-2.3.5.1/cmake-build-debug'
Makefile:129: recipe for target 'all' failed

РЕДАКТИРОВАТЬ: мне удалось исправить эту первую ошибку, скопировав готовый pnglibconf.h из каталога scripts исходного кода libpng. После этого определение байта в заголовке MinGW rpcndr.h, кажется, мешает методу byte(double) в oPRCFile.cc, который я только что исправил, переименовав метод в byteN и вызвав его из макроса (#define byte(c) byteN(c)). Хотя это может быть не совсем правильный путь, он работает.

Но когда все это исправлено, кажется, что компоновщик настроен неправильно: он говорит cannot find -lpng32. Как я могу исправить это?

РЕДАКТИРОВАТЬ: Хорошо, он скомпилирован. Поэтому я скопировал libmgl.a и поместил его в проект, который я хочу использовать. Я связался с ним с помощью cmake, вызвав target_link_libraries(Test ${CMAKE_SOURCE_DIR}/libmgl.a), но он просто выдает кучу ошибок undefined reference to (то же самое, если я использую предварительно скомпилированные двоичные файлы):

MakeFiles\Test.dir/objects.a(main.cpp.obj): In function `ZN8mglDataAC2Ev':
c:/mingw/include/mgl2/abstract.h:156: undefined reference to `_imp___ZTV8mglDataA'
CMakeFiles\Test.dir/objects.a(main.cpp.obj): In function `ZN8mglDataAD2Ev':
c:/mingw/include/mgl2/abstract.h:157: undefined reference to `_imp___ZTV8mglDataA'
[...]

person aquaatic    schedule 09.04.2017    source источник


Ответы (1)


Похоже, что отсутствующий заголовочный файл создается после запуска конфигурации для libpng (что в Windows вы, возможно, не сможете сделать, и вам нужно сгенерировать самостоятельно -> Не удается открыть включаемый файл: 'pnglibconf.h':Нет такого файла или каталога)

Но помимо этого, как у вас сложилось впечатление, что вам нужно построить его с нуля, чтобы использовать его? Вы также можете загрузить предварительно скомпилированные двоичные файлы и связать их со своей программой (http://mathgl.sourceforge.net/doc_en/Installation.html - пункт 2).

редактировать: Глядя на ваше редактирование, вам нужно указать фактический файл библиотеки в Windows (возможно, что-то вроде строк png32.a или что-то еще, сгенерированное вашей компиляцией libpng), предполагая, что компоновщик также имеет путь, где находится файл библиотеки (см. http://www.mingw.org/wiki/specify_the_libraries_for_the_linker_to_use)

person user2047610    schedule 09.04.2017
comment
Спасибо. Я отредактировал сообщение. И хотя можно использовать предварительно скомпилированные двоичные файлы, я все же хочу, чтобы это работало, так как это может пригодиться когда-нибудь позже. - person aquaatic; 09.04.2017
comment
Правда, я думаю, что в качестве учебного опыта это неплохо, но в зависимости от библиотек, которые вы собираетесь использовать, это может быть намного проще (и сэкономить время), если вы полагаетесь на предварительно скомпилированные двоичные файлы, особенно в Windows с библиотеками, которые обычно используются в * nix системы. - person user2047610; 09.04.2017
comment
Что ж, я попробую еще раз (поскольку предварительно скомпилированные двоичные файлы действительно точно включают то, что мне нужно) - РЕДАКТИРОВАТЬ: я сделал, и это не работает. Я поместил все в свои папки MinGW, связал свой .exe с помощью target_link_libraries(Test libmgl.a), и он просто выдает кучу ошибок неопределенных ссылок. - person aquaatic; 09.04.2017
comment
После быстрого поиска похоже, что у других людей тоже возникают проблемы при попытке статически связать с MathGL, возможно, попробовать динамически связать сейчас? (вместо этого укажите libmgl.dll.a и добавьте необходимые файлы .dll в $PATH при его выполнении) - person user2047610; 09.04.2017
comment
Спасибо. Я связался с библиотекой .dll.a, и она работает - типа: в ней отсутствуют dll libgcc_s_dw2-1.dll, libstdc++-6.dll, libgomp-1.dll. В любом случае: я отметил ваш ответ как единственный, потому что, я думаю, он не имеет ничего общего с реальной темой: S - person aquaatic; 09.04.2017
comment
Для первых двух это должно сделать это -> stackoverflow.com/questions/4702732/ Не уверен в другом, может исследовать позже, если вы не решили это к тому времени. - person user2047610; 09.04.2017
comment
Спасибо. Он выполняется и создает файл, как и ожидалось, но он кажется сломанным (программа просмотра изображений говорит, что у него неправильный формат)... - person aquaatic; 09.04.2017
comment
Это действительно похоже на другую проблему :) - person user2047610; 09.04.2017