如何在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
相关产品推荐
相关产品推荐

