在以后配置三方库时,一定要注意软件版本的一致性,尽量保持始终使用同一版本的软件。
以 CGAL 的配置为例,我简单罗列一下我用到的所有版本。主要注意 MSVC 编译器和 x64 标志。以下是所有版本的软件下载地址,欢迎收藏。
注:现在的 Windows 全是 x64 起步了吧,都 2019 年了
)Update 5
(注:这里一定是 Update 5 !!!此外,VS 2013 只有 x86 版本,只是项目属性有区分
)注:该链接来源于 https://msdn.itellyou.cn/ ,左侧开发人员工具选择 Visual Studio 2013 Update 5,选择 Ultimate 版本获取链接
)注:安装的时候会问你你是要 x86 还是 x64
)注:msvc2013_64
)注:msvc2013
)注:win64
)注:不分 x86 还是 x64 版本
)boost 一是用来编译 CGAL,二是在运行 CGAL 时,也需要添加 boost 的头文件
注意 boost 版本号与自己的 VS 版本一致,不知道的参考该博客:MSVC 版本号对应。另外,在我写博客时,boost 的最新版本已经是 1_70_0 ,不建议你用最新的,否则出了什么幺蛾子你自己也不知道
这个下载一个 release 版就行,.exe 是安装版本(实质也是解压),.zip 是解压版本。注意,我就是在这里掉坑的,我一开始用的 4.13.1 的CGAL。在 CMake 时报错,后来又换了 4.13 版本的,还是错,我就郁闷了,然后把 boost 从 1_70_0 降到 1_69_0 还是不行。降到 65 了还是不行,我想肯定是 CGAL 有问题,后来仔细看 CGAL 安装完成后的提示,终于找到了问题所在,就是由于 CGAl 的版本造成的!!!
CMake 是用来编译 CGAL 用的,CMake 不了解的,自行查资料
尽量找一个高版本,我用的是 3.13.0 rc2,注意 CMake 不用安装,解压即可
注意这里主要是说 x64。至于 x86 的配置和这个就是大同小异
其实编译 boost 需要注意的还挺多,你是要编译动态库还是静态库,你是要基于什么编译器进行编译,你是要编译 x86 的还是 x64 的等等,具体参考下面两个博客,尤其是第一个博客,因为目前我们只是以学习 CGAL 为主,默认的这些编译方式就无所谓了,但是以后涉及到大工程时,你就不得不注意!!!具体可以参考以下两个博客,写的很好!!!
参考博客一:boost 1.56.0 编译及使用
参考博客二:CGAL的64位开发环境配置
boost 作为很多开源库的三方库,你的电脑中可能已经有了,有的话没必要重复安装,安装多了有时候造成冲突自己都不知道…
按照官网的说法,下载完解压后就可以了,不需要进行以下的操作就可以用 boost 库来编译 CGAL。但是我不想测试了,就直接按照前人的方法操作了,一是省得又出现什么幺蛾子,二是方便以后自己使用!!!
双击 bootstrap.bat(有人说这里要用 VS 的 x64 命令行工具,其实也没必要,用了也没错)
cmd 调出来,切换到当前目录,输入 bjam address-model=64
(这里的 address-model=64 是编译生成 x64 的库,然后回车)。
编译完成后,./boost/ 就是头文件,相当于 include 文件夹,./stage/lib/ 就是静态库。至于 boost 动态库的生成与使用,用到再说
新建两个系统变量
环境变量一:变量名:BOOST_INCLUDEDIR
,变量值:D:\boost_1_65_0
环境变量二:变量名:BOOST_LIBRARYDIR
,变量值:D:\boost_1_65_0\lib64-msvc-12.0
系统变量新建一个 Path
D:\boost_1_65_0\lib64-msvc-12.0
测试一下,新建 win32 工程项目
VC++包含目录、VC++库目录就是上面的 ./boost/ 和 ./stage/lib/
链接器 - 输入 - 附加依赖项需要自己添加,添加方式为 ./stage/lib/
下新建一个 XXX.bat,内容写 DIR *.* /B>result.txt
,双击运行该 XXX.bat,就可以在 result.txt 中获取所有的 .lib,为方便直接复制,现陈列出来
libboost_atomic-vc120-mt-1_65.lib
libboost_atomic-vc120-mt-gd-1_65.lib
libboost_container-vc120-mt-1_65.lib
libboost_container-vc120-mt-gd-1_65.lib
libboost_context-vc120-mt-1_65.lib
libboost_context-vc120-mt-gd-1_65.lib
libboost_date_time-vc120-mt-1_65.lib
libboost_date_time-vc120-mt-gd-1_65.lib
libboost_exception-vc120-mt-1_65.lib
libboost_exception-vc120-mt-gd-1_65.lib
libboost_filesystem-vc120-mt-1_65.lib
libboost_filesystem-vc120-mt-gd-1_65.lib
libboost_iostreams-vc120-mt-1_65.lib
libboost_iostreams-vc120-mt-gd-1_65.lib
libboost_math_c99-vc120-mt-1_65.lib
libboost_math_c99-vc120-mt-gd-1_65.lib
libboost_math_c99f-vc120-mt-1_65.lib
libboost_math_c99f-vc120-mt-gd-1_65.lib
libboost_math_c99l-vc120-mt-1_65.lib
libboost_math_c99l-vc120-mt-gd-1_65.lib
libboost_math_tr1-vc120-mt-1_65.lib
libboost_math_tr1-vc120-mt-gd-1_65.lib
libboost_math_tr1f-vc120-mt-1_65.lib
libboost_math_tr1f-vc120-mt-gd-1_65.lib
libboost_math_tr1l-vc120-mt-1_65.lib
libboost_math_tr1l-vc120-mt-gd-1_65.lib
libboost_numpy3-vc120-mt-1_65.lib
libboost_numpy3-vc120-mt-gd-1_65.lib
libboost_prg_exec_monitor-vc120-mt-1_65.lib
libboost_prg_exec_monitor-vc120-mt-gd-1_65.lib
libboost_program_options-vc120-mt-1_65.lib
libboost_program_options-vc120-mt-gd-1_65.lib
libboost_random-vc120-mt-1_65.lib
libboost_random-vc120-mt-gd-1_65.lib
libboost_regex-vc120-mt-1_65.lib
libboost_regex-vc120-mt-gd-1_65.lib
libboost_serialization-vc120-mt-1_65.lib
libboost_serialization-vc120-mt-gd-1_65.lib
libboost_stacktrace_noop-vc120-mt-1_65.lib
libboost_stacktrace_noop-vc120-mt-gd-1_65.lib
libboost_stacktrace_windbg-vc120-mt-1_65.lib
libboost_stacktrace_windbg-vc120-mt-gd-1_65.lib
libboost_system-vc120-mt-1_65.lib
libboost_system-vc120-mt-gd-1_65.lib
libboost_wserialization-vc120-mt-1_65.lib
libboost_wserialization-vc120-mt-gd-1_65.lib
工程属性改成 x64
的平台,debug 和 release 无所谓
测试代码
#include
#include
using namespace std;
int main() {
using boost::lexical_cast;
int a = lexical_cast<int>("123");
double b = lexical_cast<double>("123.0123456789");
string s0 = lexical_cast<string>(a);
string s1 = lexical_cast<string>(b);
cout << "number: " << a << " " << b << endl;
cout << "string: " << s0 << " " << s1 << endl;
int c = 0;
try {
c = lexical_cast<int>("abcd");
} catch (boost::bad_lexical_cast &e) {
cout << e.what() << endl;
}
getchar();
return 0;
}
至此,boost 的配置已经完成,我觉得写得很详细了,关键点也已经说了,若你还有疑问,欢迎留言,一起进步!!!
不管你下载的是 .exe 还是 .zip,前者进行安装,后者进行解压,效果都一样。(我解压在了 D:/CGAL)
安装完毕后,务必检查安装的是否正确!!!
第一,检查 ./CGAL/auxiliary/gmp/ 下是否有东西,没有的话赶紧打住,重下载一个低版本的 CGAL 进行安装
第二,检查系统变量是否增加了 CGAL_DIR(变量值为 D:\CGAL) 这一变量,没有的话,自行添加!!!
第三,检查系统变量 Path 下是否增加了 D:\CGAL\auxiliary\gmp\lib,没有的话,自行添加!!!我就是通过 CMake 报错推断 CGAL 有错,然后根据 CGAL 完成时候的提醒推断出来这里有错,最终发现我的 gmp 时空的!!!
cmake-gui.exe
Configure
Configure
Generate
Generate
完毕后,就完毕了,此时 build 文件夹下有这么些内容,主要是 CGAL.slnCGAL.sln
此时在 build 文件夹下生成 include、bin 和 lib 3 个文件夹,我们肯定想把其打包成一个精炼、简洁的库,但是存在以下几个问题
我们最终的 include
由两部分组成
,第一部分是:将 build 文件夹下的 include 文件夹里 CGAL 文件夹里的 compiler_config.h
复制到解压出来的 include/CGAL 文件夹后得到的 include 文件夹
;第二部分是:解压出来的 auxiliary\gmp\include 文件夹
。(这里写的啰嗦,但是这是重点!!!)
我们最终的 bin 也由两部分组成
,第一部分是:build 文件夹下的 bin 文件夹,里边有 8 个文件,4 个 debug 的,4 个 release 的
;第二部分是:auxiliary\gmp\lib
,因为这个路径下也有两个 dll(libgmp-10.dll
和 libmpfr-4.dll
)
我们最终的 lib 也由两部分组成
,第一部分是:build 文件夹下的 lib 文件夹,里边同样是有 8 个文件,4 个 debug 的,4 个 release 的
;第二部分是:auxiliary\gmp\lib
,因为这个路径下也有两个 lib(libgmp-10.lib
和 libmpfr-4.lib
)
我们最终还需要在系统变量的 Path
下添加上述两个 bin 路径
,分别为 D:\CGAL\auxiliary\gmp\lib
和 D:\CGAL\bin
(我是直接将 CGAL 库整理在 D 盘
)。然后重启电脑!!!重启电脑!!!重启电脑!!!!
我觉得有必要画一个图说一下最后打包好的库的相对路径
CGAL(总文件夹)
|
|---auxiliary
| |---dgb(这个其实也没什么用,除非你用到 python)
| |---gmp
| |---include
| | |---gmp.h
| | |---mpf2mpfr.h
| | |---mpfr.h
| |---lib
| |---libgmp-10.dll
| |---libgmp-10.lib
| |---libmpfr-4.dll
| |---libmpfr-4.lib
|
|
|---bin
| |---CGAL_Core-vc120-mt-4.8.dll
| |---CGAL_Core-vc120-mt-gd-4.8.dll
| |---CGAL_ImageIO-vc120-mt-4.8.dll
| |---CGAL_ImageIO-vc120-mt-gd-4.8.dll
| |---CGAL_Qt5-vc120-mt-4.8.dll
| |---CGAL_Qt5-vc120-mt-gd-4.8.dll
| |---CGAL-vc120-mt-4.8.dll
| |---CGAL-vc120-mt-gd-4.8.dll
|
|---examples(想玩官方 Demo 的话你就留着,不想的话删了)
| |---...
|
|---include
| |---CGAL
| |---若干文件夹
| |---...
| |---若干 .h
| |---...
| |---compiler_config.h
| |---...
| |---gmp.h(注意这个 gmp.h 和 auxiliary\gmp\include\gmp.h 不一样,但是你还必须都添加到包含目录)
| |---...
|
|---lib
|---CGAL_Core-vc120-mt-4.8.lib
|---CGAL_Core-vc120-mt-gd-4.8.lib
|---CGAL_ImageIO-vc120-mt-4.8.lib
|---CGAL_ImageIO-vc120-mt-gd-4.8.lib
|---CGAL_Qt5-vc120-mt-4.8.lib
|---CGAL_Qt5-vc120-mt-gd-4.8.lib
|---CGAL-vc120-mt-4.8.lib
|---CGAL-vc120-mt-gd-4.8.lib
系统环境变量
应该是这样的系统环境变量的 Path
应该是这样的我是直接将 CGAL 库 和 boost 库 都整理在 D 盘
)x64
的平台,debug 和 release 根据你的 CGAL 的配置来D:\CGAL\auxiliary\gmp\include;D:\CGAL\include;D:\boost_1_65_0;
D:\boost_1_65_0\lib64-msvc-12.0;D:\boost_1_65_0\stage\lib;D:\CGAL\lib;D:\CGAL\auxiliary\gmp\lib;
CGAL-vc120-mt-4.8.lib
CGAL_Core-vc120-mt-4.8.lib
CGAL_ImageIO-vc120-mt-4.8.lib
CGAL_Qt5-vc120-mt-4.8.lib
libgmp-10.lib
libmpfr-4.lib
libboost_atomic-vc120-mt-1_65.lib
libboost_atomic-vc120-mt-gd-1_65.lib
libboost_container-vc120-mt-1_65.lib
libboost_container-vc120-mt-gd-1_65.lib
libboost_context-vc120-mt-1_65.lib
libboost_context-vc120-mt-gd-1_65.lib
libboost_date_time-vc120-mt-1_65.lib
libboost_date_time-vc120-mt-gd-1_65.lib
libboost_exception-vc120-mt-1_65.lib
libboost_exception-vc120-mt-gd-1_65.lib
libboost_filesystem-vc120-mt-1_65.lib
libboost_filesystem-vc120-mt-gd-1_65.lib
libboost_iostreams-vc120-mt-1_65.lib
libboost_iostreams-vc120-mt-gd-1_65.lib
libboost_math_c99-vc120-mt-1_65.lib
libboost_math_c99-vc120-mt-gd-1_65.lib
libboost_math_c99f-vc120-mt-1_65.lib
libboost_math_c99f-vc120-mt-gd-1_65.lib
libboost_math_c99l-vc120-mt-1_65.lib
libboost_math_c99l-vc120-mt-gd-1_65.lib
libboost_math_tr1-vc120-mt-1_65.lib
libboost_math_tr1-vc120-mt-gd-1_65.lib
libboost_math_tr1f-vc120-mt-1_65.lib
libboost_math_tr1f-vc120-mt-gd-1_65.lib
libboost_math_tr1l-vc120-mt-1_65.lib
libboost_math_tr1l-vc120-mt-gd-1_65.lib
libboost_numpy3-vc120-mt-1_65.lib
libboost_numpy3-vc120-mt-gd-1_65.lib
libboost_prg_exec_monitor-vc120-mt-1_65.lib
libboost_prg_exec_monitor-vc120-mt-gd-1_65.lib
libboost_program_options-vc120-mt-1_65.lib
libboost_program_options-vc120-mt-gd-1_65.lib
libboost_random-vc120-mt-1_65.lib
libboost_random-vc120-mt-gd-1_65.lib
libboost_regex-vc120-mt-1_65.lib
libboost_regex-vc120-mt-gd-1_65.lib
libboost_serialization-vc120-mt-1_65.lib
libboost_serialization-vc120-mt-gd-1_65.lib
libboost_stacktrace_noop-vc120-mt-1_65.lib
libboost_stacktrace_noop-vc120-mt-gd-1_65.lib
libboost_stacktrace_windbg-vc120-mt-1_65.lib
libboost_stacktrace_windbg-vc120-mt-gd-1_65.lib
libboost_system-vc120-mt-1_65.lib
libboost_system-vc120-mt-gd-1_65.lib
libboost_wserialization-vc120-mt-1_65.lib
libboost_wserialization-vc120-mt-gd-1_65.lib
写代码进行测试,用两个例子来进行测试(两个都对了,就说明没问题了
)
写代码,进行第一次测试,这个代码来源于官网示例 Hello World
#include
#include
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
int main() {
Point_2 p(1, 1), q(10, 10);
std::cout << "p = " << p << std::endl;
std::cout << "q = " << q.x() << " " << q.y() << std::endl;
std::cout << "sqdist(p,q) = "
<< CGAL::squared_distance(p, q) << std::endl;
Segment_2 s(p, q);
Point_2 m(5, 9);
std::cout << "m = " << m << std::endl;
std::cout << "sqdist(Segment_2(p,q), m) = "
<< CGAL::squared_distance(s, m) << std::endl;
std::cout << "p, q, and m ";
switch (CGAL::orientation(p, q, m)) {
case CGAL::COLLINEAR:
std::cout << "are collinear\n";
break;
case CGAL::LEFT_TURN:
std::cout << "make a left turn\n";
break;
case CGAL::RIGHT_TURN:
std::cout << "make a right turn\n";
break;
}
std::cout << " midpoint(p,q) = " << CGAL::midpoint(p, q) << std::endl;
return 0;
}
#include
#include
#include
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
int main() {
Point_2 p(0, 0.3), q, r(2, 0.9);
{
q = Point_2(1, 0.6);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
{
std::istringstream input("0 0.3 1 0.6 2 0.9");
input >> p >> q >> r;
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
{
q = CGAL::midpoint(p, r);
std::cout << (CGAL::collinear(p, q, r) ? "collinear\n" : "not collinear\n");
}
return 0;
}
可能碰到的一些错误请看下文~~~
至此,单独的 CGAL 的配置已经完成,我觉得写得很详细了,关键点也已经说了,若你还有疑问,欢迎留言,一起进步!!!
libQGLViewer-2.7.1
debug
下的生成release
下的生成QGLViewerd2_d.lib
和 QGLViewerd2_d.dll
libQGLViewer-2.7.1\examples\simpleViewer\examples.pro
如果你还有需求,那你可以继续编译插件 plugin,这时候是编译 designerPlugin.pro
将编译出来的 qglviewerplugin.lib
和 qglviewerplugin.dll
拷贝至 D:\Qt\5.7\msvc2013_64\plugins\designer
下
此时就可以在 VS + Qt 集成环境下使用该窗口了
该部分内容参考以下博客:
win10+ vs2015+QT5.7.0+boost_1_62_0+ CMake3.7.0+cgal-4.9的64位开发环境配置
*QGLViewer 编译安装步骤
*在Win10,VS2013 中配置CGAL库
我也是人品差,把能遇到的问题都遇到了,也是醉了。。。不过也学到了很多~~~
解决办法:重新下载 CGAL 安装包,原因可能是因为你缺少 gmp 文件夹内的相关东西,具体见上文
解决办法:检查你的 include 和 lib 设置的是否正确,请仔细阅读详细配置过程
解决办法:检查你的 VS 2013 是否是 Update 5 版本(下图为 非Update 5 和 Update 5 版本对比)
解决办法:添加头文件 #include
参考:use of undeclared identifier 'CGAL_assertion’
解决办法:请及时留言评论