MARK errors in "limit" file,由CGAL的启发
EX:
C:\Program Files\Microsoft Visual Studio 8\VC\include\limits(1080) : error C2065: 'LDBL_MIN' : undeclared identifier
C:\Program Files\Microsoft Visual Studio 8\VC\include\limits(1085) : error C2065: 'LDBL_MAX' : undeclared identifier
C:\Program Files\Microsoft Visual Studio 8\VC\include\limits(1090) : error C2065: 'LDBL_EPSILON' : undeclared identifier
I dig in it and found that on of my library files include "limit" and so it generates the problem. part of the code that use limit is:
// Some useful constants
#if defined CGAL_CFG_NO_LIMITS
# if defined CGAL_CFG_DENORMALS_COMPILE_BUG
// For compilers crashing when dealing with denormalized values.
// So we have to generate it at run time instead.
# define CGAL_IA_MIN_DOUBLE (CGAL::CGALi::minimin)
# else
# define CGAL_IA_MIN_DOUBLE (5e-324)
# endif
# define CGAL_IA_MAX_DOUBLE (1.7976931348623157081e+308)
#else
# include <limits>
# define CGAL_IA_MIN_DOUBLE std::numeric_limits<double> : : denorm_min()
# define CGAL_IA_MAX_DOUBLE std::numeric_limits<double> : : max()
#endif
above code is in fpu.h which is a CGAL file.
外网的答案:
How does the library related to the project? Is the library wrote by you own? Constants like 'LDBL_MIN' is defined in float.h, which is included in limits.h via cfloat. But there is a "#ifndef RC_INVOKED" before "#include <cfloat>", so if RC_INVOKED is defined somewhere, you will get these errors since FLT_RADIX is now undefined.
理清这一逻辑的关系:
LDBL_MIN是常数,定义在float.h当中,这是vs安装时带的系统类库,在不管什么语言都会使用到它,针对c语言的就是cfloat.h,而这一问文件包括在limit.h中,从而让程序使用。
我看了看问题,发现原因在于,CGAL声明了float.h的文件,而vs也声明了float.h的文件,而常数LDBL_MIN是在vs的float.h声明的,当我们在程序中
#include <cfloat>,
而float里头的代码是
#pragma once
#ifndef _CFLOAT_
#define _CFLOAT_
#include <yvals.h>
#include <float.h>
#endif /* _CFLOAT_ */
cfloat(注意,cfloat不是.h文件)中包含了float.h,而程序运行的时候,不知道是要定位哪一个float.h,vs的这些库是系统路径,也就是全局,而我们使用的CGAL时,我们为其配置了头文件和库文件的路径,所以程序会先到这些路径去找,如果找不到,然后再到系统路径下头去找。这样一来,程序运行时先找到的就是CGAL自己声明的float.h,而系统的float.h才是声明这些常数的头文件,从而造成错误。(注意,系统找到一个float.h即停止,不会继续找下去,它默认所有的同名.h都是一样的,只是有时候根据需要复制到不同的位置。)
解决办法:
因为CGAL的float.h文件是在 C:\Program Files\CGAL-4.0\include\CGAL 这一安装路径下,而系统的路径是在工具->选项->vc++目录($(VCInstallDir)include), 钱币符号$是用来指定相对路径的,VCInstallDir这一变量指的是安装vs过程中将这些c++的相关文件放置的位置,
所以尝试将C:\Program Files\CGAL-4.0\include\CGAL这一路径配置到工具->选项->vc++目录下,系统文件的后面,即$(VCInstallDir)include后面,程序运行时检测的顺序是从上到下,如图所示:
PS:工具->选项->vc++目录,这个相当于是环境变量,类似于在我的电脑->属性->高级->环境变量 中进行配置。
当我们为vs配置路径时,系统只找该文件夹下头的文件,如果该文件夹下头还包含文件夹,系统不会去搜索子文件夹下头的文件。若程序里头用到了子文件夹里头的相关文件,有两种解决办法:
(1)添加该文件夹路径
(2)在引用头文件时添加,比如
我们配置了路径C:\Program Files\CGAL-4.0\include,然后include中包含CGAL这个文件夹,我们要用到该文件夹下头的gmp.h,就可以在程序中(.cpp文件)写
#include <CGAL/gmp.h>。
当多个文件夹嵌套的时候,<boost/math/policies/policy.hpp>,这是的路径是在生成系统路径下头,boost文件夹的子文件夹math,一层一层往里,知道policies文件夹下头的policy.cpp文件。
当前源文件的目录与生成系统路径:
当前源文件的目录是指某个.h或者.cpp中包括了某个头文件,而这个.h/.cpp文件所在的位置,我们称之为当前源文件的目录;
生成系统路径是指我们为vs配置的路径,即在属性->配置。。下头添加的路径。
注:系统只搜索该文件夹下的文件是为了提高效率,因为多数情况下是文件夹套着文件夹,如果在层层搜索的话,效率会低很多。
error:
d:\program files\boost_1_46_1\boost\math\bindings\mpfr.hpp(25) : fatal error C1083: 无法打开包括文件:“gmpfrxx.h”: No such file or directory
这里的意思是说d:\program files\boost_1_46_1\boost\math\bindings\mpfr.hpp文件中包括了“gmpfrxx.h”,但是vs运行的时候找不到该文件。