win7+VS2008安装CGAL以及关键问题的解决方案

来源:互联网 发布:java jini 编辑:程序博客网 时间:2024/05/22 13:56

最近为了找约束三角剖分细化(CDT refinement)的代码,搜索到CGAL库这个好东西,不过要顺利安装这个东西真是费了我好大的劲。网上的教程很多,感觉最为完整的教程还是老外写的比较清楚(单词都很简单,不妨看一下,一步步照着来就可以了)点击打开链接 如果你嫌麻烦也可以先看一下下面我的安装建议,对安装顺序也有所了解。

从上面链接内容来看,老外指导CGAL安装的前提:分别安装boost、CMake、QT、QT_addin 4个软件包。需要的软件包如下:


版本问题大家自己选择即可,之前我电脑上装过CMake2.8.0,但是后来在CMake编译CGAL的过程中提示我的版本过低,不能顺利编译,因此我就又下了一个CMake2.8.12就ok了。

问题来了:一定要按顺序这样安装么?答案是:不一定,但是“部分”必须按顺序来。比如我就是先安装了CMake和QT、QT_addin。(这是因为我很早需要用openCV,要用到CMake这个工具;然后前几天刚好发现需要用QT,然后就也安装了QT)。

CMake只是一个编译的辅助工具,并不针对CGAL设计,在安装openCV过程中可能也会用到这个工具,关于如何安装openCV这一部分请参考我之前的博文(点击打开链接)。CMake的安装顺序不讲究,只要在编译CGAL库之前安装完成就可以;而且CMake在这几个安装里面最为简单,用installer打开一路点击next就可以安装成功。

而boost和QT、QT_addin之间没有太大的关系,只是CGAL库的编写都是基于这两块的,所以boost和(QT、QT_addin)的顺序可以换一下,QT_addin是在QT基础上安装的,所以一定要先安装QT,再安装QT_addin。

CGAL安装最麻烦的地方就在于boost和它自己本身,boost安装请参考我的前一篇博文(点击打开链接),boost安装比较耗时。QT,QT_addin的安装最为简单,只要打开一路安装到底就可以(具体安装可参考我的下一篇博文)。唯一需要注意的是,QT的安装路径不支持空格和中文,于是我直接装在了C盘根目录下,平时软件包我都安装在C:Program Files (x86)中(我的是apple PC,好像D盘不能被安装,只能备份orz...)。


下面主要介绍安装CGAL过程:

  • 下载安装包CGAL-4.5-Setup,运行(需在联网的情况下安装)
  • 选择32-bits,选择安装路径,然后在环境变量的设置勾选“all users”和“CGAL_DIR”,如图   
  • 安装完成之后,确认环境变量中已经有“C:\Program Files (x86)\CGAL\4.5”,(右击 计算机-->属性-->高级-->环境变量-->系统变量),并且添加新的路径 “(安装路径)\auxiliary\gmp\lib”,如我的电脑上输入路径是“C:\Program Files (x86)\CGAL\4.5\auxiliary\gmp\lib”,变量名可以随便取。
  • 编译CGAL:
    • 打开CMake的bin文件夹中的cmake-gui,在win7系统中运行右击“以管理员身份运行”;
    • 在"Where is the source code" 和 "Where to build the binaries" 都输入CGAL安装的路径,“C:\Program Files (x86)\CGAL\4.5”
    • 点击configure,选择“Visual Studio 9 2008”,点击“Finish”
    • configure完成之后,再点击generate
    • 至此,CGAL的安装文件夹中一个名为“CGAL”解决方案被建立,如图             
    • 用VS打开,如图         
    • 在debug和release模式下分别编译 ALL_BUILD:右击ALL_BUILD-->重新生成;
  • 新建工程项目,打开“工具-->选项-->VC++解决方案”,添加相应文件所在的路径:
    • 选择“可执行文件”(exe),新增路径“C:\Program Files (x86)\CGAL\4.5\bin”(即"<安装路径>\bin");
    • 选择“库文件”(lib),新增路径“C:\Program Files (x86)\CGAL\4.5\lib”(即"<安装路径>\lib")和“C:\Program Files (x86)\CGAL\4.5\auxiliary\gmp\lib”(即"<安装路径>\auxiliary\gmp\lib");
    • 选择“包含文件”(include),新增路径“C:\Program Files (x86)\CGAL\4.5\auxiliary\gmp\include”(即"<安装路径>\auxiliary\gmp\include")和“C:\Program Files (x86)\CGAL\4.5\include”(即"<安装路径>\include");
    • 选择“源文件”(source),新增路径“C:\Program Files (x86)\CGAL\4.5\src”(即"<安装路径>\src")。
    • 以上添加文件路径的图分别如下



    • 至此,CGAL的安装和VS上的CGAL配置完成。


建立工程,测试一段代码(代码来源参考):

<span style="font-size:14px;"><span style="font-size:14px;">#include <iostream>#include <boost/format.hpp>#include <QtGui>#include <CGAL/Qt/GraphicsViewNavigation.h>#include <QLineF>#include <QRectF>int main(int argc, char **argv){QApplication app(argc, argv);QGraphicsScene scene;scene.setSceneRect(0,0, 100, 100);scene.addRect(QRectF(0,0, 100, 100), QPen(QColor(255,0,0)));scene.addLine(QLineF(0,0, 100, 100));scene.addLine(QLineF(0,100, 100, 0));QGraphicsView* view = new QGraphicsView(&scene);CGAL::Qt::GraphicsViewNavigation navigation;view->installEventFilter(&navigation);view->viewport()->installEventFilter(&navigation);view->setRenderHint(QPainter::Antialiasing);view->show();return app.exec();}</span></span>

1. 编译错误问题:

编译之后出现如下错误:"error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall QApplication::~QApplication(void)" (__imp_??1QApplication@@UAE@XZ),该符号在函数 _main 中被引用"

...

上面类似的错误大概一共有81项,这是因为CGAL虽然顺利的安装了,也设置了相应的环境变量和文件路径,但是因为以上函数的调用需要依赖一些库,这些库必须在项目的配置中写出来。

点击项目-->属性-->配置属性-->链接器-->输入-->依赖项

输入:boost_thread-vc90-mt-1_57.lib boost_thread-vc90-mt-1_57.lib CGAL_Core-vc90-mt-gd-4.5.lib CGAL_ImageIO-vc90-mt-gd-4.5.lib CGAL_Qt4-vc90-mt-gd-4.5.lib CGAL-vc90-mt-gd-4.5.lib  QtCored4.lib QtGui4.lib QtGuid4.lib (注意两个lib文字之间有一个空格)

之前我的依赖项里面没有包含后面4个lib,但是测试代码中用到的函数调用需要依赖于这几个库,所以会出现以上“无法解析”的一系列错误!

注:上面的lib文字中,通常有名字类似但只差了一个"d"的两个lib文件,这是带有d的表示debug模式下的库,而不带d的表示release模式下的库。如果你只在一个模式下编译,上面的依赖项只要取一种即可。


2. dll文件缺失问题:

虽然编译成功了,但是运行之后,弹出错误框 "出现无法启动程序, 因为计算机中丢失CGAL-vc90-mt-gd-4.5.dll,..."。这个我有点无法理解,因为我自己搜索这个dll文件,是可以在CGAL安装目录下的bin文件夹中找到相应的dll文件的,而且我们在设置“工具-选项”中添加了相应的路径(难道不会自己去搜索么?)anyway,搜索了一些方法,发现最后的解决方案,就是把你上面依赖项所对应的dll文件全部都找到,然后复制到自己的工程目录下,如图

  

(我建立的是名称为CDT_CGAL的工程,dll要放在工程目录下的CDT_CGAL文件夹下,即上面的第一个文件夹中)



2014.11.12更新:

以上将所有dll文件拷贝到工程目录下,不但繁琐,而且可能会存在潜在冲突的危险(因为这些动态链接库dll可尚在测试或者开发中,会存在多个版本,造成冲突)。后来网上搜索了以上关于dll文件链接的问题,最后找到一个比较好的方法(参考点击打开链接),就是设置工程的环境变量。

步骤:点击工程属性-->配置属性-->调试-->环境,设置值为“PATH=<dll路径>;$(TargetDir)\DLLS”,我设置的值为“PATH=C:\QT\4.7.4\bin;C:\Program Files (x86)\CGAL\4.5\bin;C:\Program Files (x86)\CGAL\4.5\auxiliary\gmp\lib;C:\Program Files (x86)\boost\boost_1_57_0\stage\lib;$(TargetDir)\DLLS”。

另外,如果还是会出现“无法找到CGAL_Qt4-vc90-mt-gd-4.5.lib”这种情况,搜索该名称发现它存在于以上路径“D:\Program Files\CGAL\4.5\lib”中的Debug文件夹下,我的做法是直接将“Debug”和“Release”文件夹下的所有文件拷贝到上一层目录中。这样,工程环境中就可以自动搜索到这个文件。

以上这种方法相当于将所有所需要的dll文件所在的路径临时添加到工程所属的系统PATH中。如图:



然后就可以编译运行成功了!



后来再运行一个新的测试代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>#include <CGAL/Constrained_Delaunay_triangulation_2.h>#include <CGAL/Triangulation_conformer_2.h>#include <iostream>typedef CGAL::Exact_predicates_inexact_constructions_kernel K;typedef CGAL::Constrained_Delaunay_triangulation_2<K> CDT;typedef CDT::Point Point;typedef CDT::Vertex_handle Vertex_handle;int main(){CDT cdt;// construct a constrained triangulationVertex_handleva = cdt.insert(Point( 5., 5.)),vb = cdt.insert(Point(-5., 5.)),vc = cdt.insert(Point( 4., 3.)),vd = cdt.insert(Point( 5.,-5.)),ve = cdt.insert(Point( 6., 6.)),vf = cdt.insert(Point(-6., 6.)),vg = cdt.insert(Point(-6.,-6.)),vh = cdt.insert(Point( 6.,-6.));cdt.insert_constraint(va,vb);cdt.insert_constraint(vb,vc);cdt.insert_constraint(vc,vd);cdt.insert_constraint(vd,va);cdt.insert_constraint(ve,vf);cdt.insert_constraint(vf,vg);cdt.insert_constraint(vg,vh);cdt.insert_constraint(vh,ve);std::cout << "Number of vertices before: "<< cdt.number_of_vertices() << std::endl;// make it conforming DelaunayCGAL::make_conforming_Delaunay_2(cdt);std::cout << "Number of vertices after make_conforming_Delaunay_2: "<< cdt.number_of_vertices() << std::endl;// then make it conforming GabrielCGAL::make_conforming_Gabriel_2(cdt);std::cout << "Number of vertices after make_conforming_Gabriel_2: "<< cdt.number_of_vertices() << std::endl;system("PAUSE");}

依然用以上设置好的工程环境以及附加依赖项,又出现类似的编译错误:

无法解析的外部符号 __imp____gmpq_clear,该符号在函数 "public: __thiscall CGAL::Gmpq_rep:...

这说明上面的测试代码使用的一些函数依赖于某些库文件,没有被加进来。

在附加依赖项中继续添加“libgmp-10.lib”,编译成功。

运行后又出现一个弹出框,“无法启动此程序,因为计算机中丢失 boost_chrono-vc90-mt-1_57.dll。尝试重新安装该程序以解决问题”,如图


和上述做法一样,这次丢失的dll文件是和boost有关,所以可以在boost安装文件夹中寻找相应的dll文件,最后在<boost安装路径>/stage/lib中找到这个动态链接库,拷贝到工程目录下,最后运行成功!



基于以上编译、运行问题的总结:

在项目属性中的附加依赖项添加相应的.lib文件,这些文件会自动连接动态链接库(即.dll文件),所以搜索相应的dll文件拷贝到工程目录下。从我的搜索结果来看,boost、QT、CGAL对应的dll通常可能存在于:

1. boost:<安装路径>/stage/lib(里面存在boost_system-vc90-mt-gd-1_57.dll, boost_chrono-vc90-mt-1_57.dll, boost_thread-vc90-mt-gd-1_57.dll等);

2. Qt:<安装路径>/bin(里面存在QtCore4.dll, QtCored4.dll, QtGui4.dll, QtGuid4.dll, QtOpenGL4.dll等);

3. CGAL:<安装路径>/bin (里面存在CGAL_Qt4-vc90-mt-gd-4.5.dll, CGAL_ImageIO-vc90-mt-4.5.dll等) <安装路径>/auxiliary/gmp/lib (里面存在libgmp-10.dll)


1 0
原创粉丝点击