Я новичок в 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'
[...]