You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在D语言中正确链接CGAL库?

D语言调用CGAL库:解决链接阶段依赖问题

核心问题梳理

你已经通过C++生成了CGAL相关的目标文件,但在D程序链接时缺少CGAL及其依赖库的正确链接参数,直接依赖CMake生成的link.txt存在不稳定问题。下面是更可靠的解决方案:


步骤1:编译独立的C++目标文件(无需main函数)

先移除test.cpp中的main函数,避免CMake试图生成可执行文件。直接用g++编译目标文件,同时带上CGAL的编译参数,摆脱对CMake构建流程的依赖:

// 修改后的test.cpp(移除main函数)
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/create_offset_polygons_2.h>
#include <CGAL/Straight_skeleton_2/IO/print.h>
#include <memory>
#include <cassert>
#include <vector>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K ;
typedef K::FT                        FT ;
typedef K::Point_2                   Point ;
typedef CGAL::Polygon_2<K>           Polygon_2 ;
typedef CGAL::Straight_skeleton_2<K> Ss ;
typedef std::shared_ptr<Polygon_2> PolygonPtr ;
typedef std::shared_ptr<Ss> SsPtr ;
typedef std::vector<PolygonPtr> PolygonPtrVector ;

void test()
{
  Polygon_2 poly ;
  poly.push_back( Point(-1,-1) ) ;
  poly.push_back( Point(0,-12) ) ;
  poly.push_back( Point(1,-1) ) ;
  poly.push_back( Point(12,0) ) ;
  poly.push_back( Point(1,1) ) ;
  poly.push_back( Point(0,12) ) ;
  poly.push_back( Point(-1,1) ) ;
  poly.push_back( Point(-12,0) ) ;

  assert(poly.is_counterclockwise_oriented());
  FT lOffset = 1 ;

  PolygonPtrVector inner_offset_polygons = CGAL::create_interior_skeleton_and_offset_polygons_2(lOffset,poly);
  PolygonPtrVector outer_offset_polygons = CGAL::create_exterior_skeleton_and_offset_polygons_2(lOffset,poly);

  CGAL::Straight_skeletons_2::IO::print_polygons(inner_offset_polygons);
  CGAL::Straight_skeletons_2::IO::print_polygons(outer_offset_polygons);
}

编译命令:

g++ -c test.cpp -o test.o `pkg-config --cflags CGAL`

如果系统没有pkg-config,手动指定CGAL的头文件路径即可,比如-I/usr/include/CGAL。


步骤2:获取CGAL的链接参数

用pkg-config直接获取CGAL及其依赖库的链接选项,这是最稳定的方式:

pkg-config --libs CGAL

输出示例:

-lCGAL -lgmp -lmpfr -lgmpxx

如果pkg-config不可用,从系统库路径中提取参数,确保用-L指定库路径(需要时)、-l指定库名,比如-L/usr/lib/x86_64-linux-gnu -lCGAL -lgmp -lmpfr -lgmpxx。


步骤3:用DMD完成链接

将D文件、C++目标文件和所有链接参数组合,执行编译:

dmd test.d test.o -L-lstdc++ `pkg-config --libs CGAL`

这里-L-lstdc++告诉DMD链接C++标准库,pkg-config --libs CGAL会自动引入CGAL及其依赖的gmp、mpfr等库。


常见问题说明

  • 直接指定.so文件路径不稳定的原因:系统库路径可能因环境、安装方式变化,用-l让系统自动查找库是更通用的做法。
  • 确保C和D使用相同的C标准库:如果你的g++用的是libstdc++,DMD也要对应链接libstdc++(即-L-lstdc++);如果是libc++,则用-L-lc++。

内容的提问来源于stack exchange,提问作者Ankylotech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:13:13