【问题标题】:CGAL compiler error: undefined reference to `CGAL::assertion_fail(char const*, char const*, int, char const*)'CGAL 编译器错误:未定义引用 `CGAL::assertion_fail(char const*, char const*, int, char const*)'
【发布时间】:2017-03-29 04:22:27
【问题描述】:

我是 CGAL 的新手,我在 Ubuntu 16.04 上使用 CGAL 4.7-4。 我正在尝试编译和运行一个非常简单的.cpp。代码如下:

#include <iostream>
#include <CGAL/Cartesian.h>

int main()
{
 int p=2;
 std::cout << "hello " << p << std::endl;
 return 0;
}

我加了一行

#include <CGAL/Cartesian.h>

因为我想看看如何编译更多的库。然后我在终端上写了这一行

g++ -lCGAL -lgmp prova.cpp

但我收到了这个错误:

/tmp/cc9DA7Ml.o:在函数'CGAL::Interval_nt::Test_runtime_rounding_modes::Test_runtime_rounding_modes()'中:

prova.cpp:(.text._ZN4CGAL11Interval_ntILb0EE27Test_runtime_rounding_modesC2Ev[_ZN4CGAL11Interval_ntILb0EE27Test_runtime_rounding_modesC5Ev]+0xd2): 未定义引用 'CGAL::assertion_fail(char const*, char const*, int, char const*)'

prova.cpp:(.text._ZN4CGAL11Interval_ntILb0EE27Test_runtime_rounding_modesC2Ev[_ZN4CGAL11Interval_ntILb0EE27Test_runtime_rounding_modesC5Ev]+0x180): 未定义引用 'CGAL::assertion_fail(char const*, char const*, int, char const*)'

/tmp/cc9DA7Ml.o:在函数'CGAL::Interval_nt::Test_runtime_rounding_modes::Test_runtime_rounding_modes()'中:

prova.cpp:(.text._ZN4CGAL11Interval_ntILb1EE27Test_runtime_rounding_modesC2Ev[_ZN4CGAL11Interval_ntILb1EE27Test_runtime_rounding_modesC5Ev]+0xd2): 未定义引用 'CGAL::assertion_fail(char const*, char const*, int, char const*)'

prova.cpp:(.text._ZN4CGAL11Interval_ntILb1EE27Test_runtime_rounding_modesC2Ev[_ZN4CGAL11Interval_ntILb1EE27Test_runtime_rounding_modesC5Ev]+0x180): 未定义引用 'CGAL::assertion_fail(char const*, char const*, int, char const*)'

collect2: 错误:ld 返回 1 个退出状态

即使我写了以下任何一行,我也会遇到同样的错误:

g++ -lCGAL -lmpfr -lgmp prova.cpp

g++ -I/opt/local/include -L/opt/local/lib -lCGAL -lgmp prova.cpp

g++ -I/opt/local/include -L/opt/local/lib/ -lCGAL -lgmp prova.cpp

g++ -I/usr/include -L/usr/bin -lCGAL -lgmp prova.cpp

g++ -I/usr/bin -L/usr/lib -lCGAL -lgmp prova.cpp

如果我写了

g++ -lCartesian.a -lCGAL -lgmp prova.cpp

g++ -lCartesian -lCGAL -lgmp prova.cpp

我在终端上收到此错误

/usr/bin/ld: 找不到 -lCartesian.a

collect2: 错误:ld 返回 1 个退出状态

如果我写到最后

g++ -I/usr/include/CGAL -L/usr/include/CGAL -lCGAL -lgmp prova.cpp

我收到了一长串类似这样的错误:

在 /usr/include/CGAL/gmpxx_coercion_traits.h:35:0 包含的文件中,

             from /usr/include/CGAL/mpz_class.h:29,
             from /usr/include/CGAL/gmpxx.h:47,
             from /usr/include/CGAL/is_convertible.h:28,
             from /usr/include/CGAL/Rational_traits.h:31,
             from /usr/include/CGAL/number_type_basic.h:48,
             from /usr/include/CGAL/basic.h:44,
             from /usr/include/CGAL/Cartesian/Cartesian_base.h:28,
             from /usr/include/CGAL/Cartesian.h:28,
             from prova.cpp:2:

/usr/include/mpfr.h:181:3: 错误:‘mp_limb_t’没有命名类型 mp_limb_t *_mpfr_d;

/usr/include/mpfr.h:279:1: 错误:‘__GMP_DECLSPEC’没有命名类型 __MPFR_DECLSPEC __gmp_const char * mpfr_get_version _MPFR_PROTO ((void));

[...]

在 /usr/include/CGAL/mpz_class.h:29:0 包含的文件中,

             from /usr/include/CGAL/gmpxx.h:47,
             from /usr/include/CGAL/is_convertible.h:28,
             from /usr/include/CGAL/Rational_traits.h:31,
             from /usr/include/CGAL/number_type_basic.h:48,
             from /usr/include/CGAL/basic.h:44,
             from /usr/include/CGAL/Cartesian/Cartesian_base.h:28,
             from /usr/include/CGAL/Cartesian.h:28,
             from prova.cpp:2:

/usr/include/CGAL/gmpxx_coercion_traits.h:43:3: 错误:'::__gmp_expr' 尚未声明

::__gmp_expr,::__gmp_expr>{

[...]

长长的列表是这样结束的:

在 /usr/include/CGAL/double.h:30:0 包含的文件中,

             from /usr/include/CGAL/number_type_basic.h:60,
             from /usr/include/CGAL/basic.h:44,
             from /usr/include/CGAL/Cartesian/Cartesian_base.h:28,
             from /usr/include/CGAL/Cartesian.h:28,
             from prova.cpp:2:

/usr/include/CGAL/number_utils.h: 在‘typename CGAL::Real_embeddable_traits::Is_finite::result_type CGAL::is_finite(const Real_embeddable&) 的实例化中 [with Real_embeddable = double;类型名 CGAL::Real_embeddable_traits::Is_finite::result_type = CGAL::Null_tag]’:

/usr/include/CGAL/double.h:201:27:这里需要

/usr/include/CGAL/number_utils.h:263:75: 错误:不匹配调用 '(CGAL::INTERN_RET::Real_embeddable_traits_base >::Is_finite {aka CGAL::Null_functor}) (const double&) '

return typename Real_embeddable_traits< Real_embeddable >::Is_finite()( x );

我在网上看了很多,我知道编译的链接部分有问题(核心没有问题),但我真的不知道解决方案。你有什么主意吗?提前感谢您的帮助。

【问题讨论】:

    标签: compiler-errors linker g++ cgal


    【解决方案1】:

    简单地说,使用 C++ 版本 14。

    如果您使用的是 Qt,则通过在 .pro 文件中执行以下操作来更改您的 C++ 版本。

    CONFIG += c++14
    

    【讨论】:

      【解决方案2】:
      g++ prova.cpp -lCGAL
      

      有效...看来这只是顺序问题。

      【讨论】: