使用CGAL的square函数出现编译及链接错误的问题咨询
问题原因与解决方案
1. 初始编译错误(Null_functor调用失败)
CGAL::square 依赖 CGAL::Algebraic_structure_traits 对传入类型的特化实现,默认情况下double、int等基础数值类型的特化定义在CGAL/basic.h头文件中,仅引用CGAL/number_utils.h会缺失对应特化,因此编译器会提示找不到对应类型的Square实现。你后续补充引入CGAL/basic.h的操作已经解决了这一阶段的问题。
2. 链接阶段多重main定义错误
C/C++的链接规则明确规定:一个可执行程序有且只能有一个入口函数main。你遇到的冲突是构建脚本的逻辑导致的:
你使用的cgal_create_CMakeLists -s tmp命令,会自动扫描当前目录下所有.cpp文件,将它们全部编译链接到名为tmp的同一个可执行文件中。如果当前目录下除了你的tmp.cpp之外,还有其他带main函数的.cpp文件,链接时就会触发多重定义错误。
你看到的DWARF报错是之前编译生成的调试信息缓存损坏导致的,清理旧的构建缓存即可消除。
3. 正确构建方法
你可以选择以下任意一种方式解决冲突:
- 移除当前目录下其他带有
main函数的.cpp文件,只保留你要编译的tmp.cpp - 手动编写CMakeLists,仅指定
tmp.cpp作为源文件,避免自动扫描所有文件 - 不带
-s tmp参数执行cgal_create_CMakeLists,脚本会为当前目录下每个.cpp单独生成可执行目标,不会将所有文件合并链接,自然也不会出现main函数冲突 - 每次重新构建前,先删除当前目录下的
CMakeCache.txt、CMakeFiles文件夹、Makefile等旧构建产物,消除缓存导致的DWARF错误。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

