我是 C++ 的新手(以前是 Java 开发人员,这更容易......),我必须编写一个应用程序,它必须绘制一些图形和图表。为此,我想使用 MathGL 库。我了解到,我必须自己编译才能使用它。所以这就是我最近几天想做的事情......
我将 Windows 与 MinGW 和 CLion IDE 一起使用。我首先将 MathGL 的源代码提取到一个文件夹中,然后使用 CLion 打开该文件夹。然后我下载了zlib和libpng的源代码,并将MathGL项目中的INCLUDE_DIR变量设置为各自的文件夹,将PNG_PNG_LIBRARY设置为png32。当我尝试通过 CLion 编译 mgl_example 时,它给了我以下错误:
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
从 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'
[...]