2017-02-10 113 views
0

初学者试图了解整个compliling +链接业务。为什么我不能像往常一样使用CGAL库来构建我的C++程序,并且需要使用CMake来构建它?为什么我需要用CMake和CMake构建我的C++程序?

其他问题:我可以在IDE中使用CMake构建吗? (例如Code :: Blocks?)

@Mike:这是我从阅读CGAL documentation得到的。我误解了什么?

+2

[This](https://cmake.org/about/)解释了CMake是什么。这并没有回答,为什么任何图书馆作者选择使用它,但它告诉你,它有什么好处。 CMake与某些IDE兼容。 Code :: Blocks是一个您应该避免的IDE,原因很多。 – IInspectable

+1

是什么让你相信你需要使用CMake来构建一个与libCGAL链接的程序? (将此信息添加到您的问题的正文) –

回答

1

你被你提到的CGAL文档误导了一些。

CGAL开发者已经选择CMake作为CGAL 源码包的构建系统。它是一个流行的构建系统(跨平台可移植性卓越)。他们还说明了用CMake构建其示例程序的 ;自然有足够的自 的例子是源包的一部分。他们还建议您使用CMake来构建您自己的依赖于CGAL的程序。

这对他们来说推荐CMake并不令人意外,这是公平的。 但是:如果要编写依赖于任何库的程序 - libfoo - 则继续假设libfoo已准备好在您的项目中使用 。这意味着:

  • libfoo头文件 - foo.h,不管是谁 - 定义库的 编程接口是你的系统上的某个地方,这样你的编译器 可以找到并阅读它们,当你写,例如#include <foo.h>在你的代码中。

  • libfoo二进制文件 - libfoo.alibfoo.sofoo.libfoo.dlllibfoo.dylib,视情况可能是你的操作系统 - 包含 库的实现也是系统的某个位置,以便 你的链接可以找到他们,将它们与您的 程序的目标代码链接起来以制作完整的可执行文件。 (并且,在动态链接库的情况下,运行时加载程序可以在其中找到它们的位置)。

所以,只要建立程序而言,它不会在所有问题 的libfoo头文件和二进制文件是怎么成为他们是你的 系统在何处,无论是放在那里CMake或仙女。那只是他们在 。然后,你可以用CMake构建你的程序,如果你愿意的话,或者你喜欢的任何其他方式 。

当然,当你决定写你的程序 libfoo您的系统上已经安装了可能出现的情况。在这种情况下,你安装它 。然后继续执行您的程序,假设它的安装为

您需要安装CGAL库和头文件。通过安装由您的操作系统使用其软件包管理器提供的libcgal开发包 或通过下载 并运行安装程序(Windows),通常可以实现 (Linux/OS X)。那么你不需要知道或关心如何构建CGAL 。

如果由于某种原因无法获得开发包,或者技术上感兴趣的是 从“第一原则”安装库,那么您需要构建并从源包安装它。由于源代码包的构建系统是 CMake,您需要学习如何使用CMake进行构建和安装,并且这样做。

一旦CGAL 安装在自己的项目中使用,你只需要采取的使用库的日常要求护理 : -

  • 你告诉编译器在哪里找库的头文件,如果它们的 不在其任何默认包含目录中。
  • 您告诉链接器链接库。
  • 如果链接器不在其默认搜索目录 之一中,则告诉链接器在哪里可以找到该库。

无论你做到这一点与CMake的,使用SCons,自动工具,一个makefile,项目在IDE 设置或只需在命令提示符下 与正确的选项运行你的编译器和链接器完全是你自己的选择。 (虽然最后是 最有效的指导,当你是一个初学者试图了解 整个编译和链接业务)。

CGAL示例程序可以使用Code :: Blocks作为普通的 带有库依赖性的简单项目来构建,只要您事先以某种方式安装CGAL 即可。

+0

请注意,对于CGAL,cmake还会传递可能需要的额外标志('-frounding-math' for gcc),以便编译器生成正确的代码,它还会链接(和添加头文件路径)与一些依赖关系(boost,gmp,...)。它将使用与用于该库的ABI兼容的ABI编译示例(在调试二进制文件与发行二进制文件不兼容的平台上的问题)。事实上,所有这些都可以通过手工完成,但是所有选项的列表尚未由CGAL记录,并且比一个-I和-l标志稍长。 –

0

当您调用cmake时,您可以在命令行上传递代码块生成器。它会创建你需要使用和建立你的ide文件。