在Windows上编译/链接时,CGAL未解析外部

时间:2013-12-15 18:06:04

标签: c++ visual-studio-2010 cgal

在编译使用CGAL库的某些部分的测试程序时,我变得很奇怪(对我来说)错误。

首先,环境:

  • Windows 7 64位
  • 提升1.53
  • CGAL 4.3
  • Qt 4.8.4
  • CMake 2.8.10.2
  • Visual Studio 2010专业人员
  • 我安装了所有32位的库(如果在安装过程中这是一个选项)。

安装错误?

为了在我的计算机上安装CGAL,我遵循了本教程:http://www.cgal.org/windows_installation.html。我必须在此注意,这对我来说并不是开箱即用的。在CMake的CGAL配置阶段,找不到boost库(尽管我设置了相应的环境变量,如教程中所述)。在CMake中设置了不正确的变量之后,我就能够完成配置和生成阶段。之后,我能够在Visual Studio中编译Debug以及CGAL的Release配置。

为了测试CGAL lib是否已成功安装,我尝试编译并运行示例和演示。这些也没有立即起作用。问题是找不到CGAL和Boost标头(和二进制文件)。在 Project properties =>中设置正确的路径后配置属性=> C / C ++ =>其他包含目录项目属性=>配置属性=>链接器=>其他库目录可以构建示例和演示。之后我成功运行了这些示例。

实际问题

现在,我正在编写一个简单的程序,以便能够进行一定的练习(http://acg.cs.tau.ac.il/courses/algorithmic-robotics/spring-2013/exercises/assignment-2练习2.1)。这里提供了两个文件:basic_typdef.h和cgal_bootcamp.cpp

* basic_typedef.h *

#pragma once
#include <CGAL/Cartesian.h>
#include <CGAL/Gmpq.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Polygon_with_holes_2.h>
#include <CGAL/Boolean_set_operations_2/Gps_default_dcel.h>
#include <CGAL/Polygon_set_2.h>
#include <list>

/*******************************************************************************************
 * This file contatins basic typedefs (from CGAL and more).
 *******************************************************************************************/

typedef CGAL::Gmpq                                  Number_type;
typedef CGAL::Cartesian<Number_type>                Kernel;
typedef Kernel::Point_2                             Point;
typedef CGAL::Polygon_2<Kernel>                     Polygon;
typedef CGAL::Polygon_with_holes_2<Kernel>          Polygon_with_holes;
typedef CGAL::Polygon_set_2<Kernel>                 Polygon_set;
typedef std::list<Polygon_with_holes>               Polygon_with_holes_container;

* cgal_bootcamp.cpp *

#include "basic_typedef.h"

int main(int argc, char* argv[])
{
    return 0;
}

(为方便起见,我删除了文件cgal_bootcamp.cpp中的注释)

使用Visual Studio,我可以编译上面的两个文件。但是,当我尝试创建一个Point(在basic_typedef.h中定义)时,我遇到了(奇怪的)错误:

#include "basic_typedef.h"


int main(int argc, char* argv[])
{
    /*
        1. Point
        http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Kernel_23_ref/Class_Point_2.html
    */

    // Create Point with the coordinates (0.5, 0.6)
    Point p;

    return 0;
}

发生的错误:

Error   1   error LNK2019: unresolved external symbol __imp____gmpq_init referenced in function "public: __thiscall CGAL::Gmpq_rep::Gmpq_rep(void)" (??0Gmpq_rep@CGAL@@QAE@XZ)  C:\Dropbox\Capita Selecta\Assignments\Assignment 2.1\warmup-exercise\cgal_bootcamp.obj  warmup-exercise
Error   2   error LNK2019: unresolved external symbol __imp____gmpq_clear referenced in function "public: __thiscall CGAL::Gmpq_rep::~Gmpq_rep(void)" (??1Gmpq_rep@CGAL@@QAE@XZ)    C:\Dropbox\Capita Selecta\Assignments\Assignment 2.1\warmup-exercise\cgal_bootcamp.obj  warmup-exercise
Error   3   error LNK1120: 2 unresolved externals   C:\Dropbox\Capita Selecta\Assignments\Assignment 2.1\warmup-exercise\Debug\warmup-exercise.exe  1   1   warmup-exercise
    4   IntelliSense: #error directive: "Mixing a dll CGAL library with a static runtime is a really bad idea..."   c:\dev\cgal-4.3\include\cgal\auto_link\auto_link.h  364 4   
    5   IntelliSense: #error directive: "some required macros where not defined (internal logic error)."    c:\dev\cgal-4.3\include\cgal\auto_link\auto_link.h  397 4   

我不知道这里出了什么问题(我必须注意到我仍然是C ++的菜鸟)。似乎GMP库有问题(至少链接到这个?)我在另一篇帖子中发现,对于某人没有构建libgmp文件(找不到该帖子了),但事实并非如此对我来说(我认为):在CGAL-4.3 / auxiliary / gmp / lib中我看到四个文件,libgmp-10.dll libgmp-10.lib libmpfr-4.dll和libmpfr-4.lib。

此外,第4行的错误指向可能导致此错误的内容(“将dll CGAL库与静态运行时混合是一个非常糟糕的主意......”),但我不知道这实际意味着什么(或我怎么解决它。)

此外,我尝试在另一台计算机上设置所有库,但我也遇到了同样的错误。

有人能指出我正确的方向来解决这个问题吗?如果您需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

This comment回答了这个问题:脚本cgal_create_cmake_script可用于创建一个CMake文件,该文件可用于使用CGAL生成正确的Visual Studio项目。