Boost.Python 模块中未定义的符号

2024-01-09

我正在尝试使用 Boost.Python 为模板库的某个实例构建一个小型 Python 扩展。该库广泛使用 CGAL 库,它与 CMake 集成得相当好,因此我将其用于我的项目。

这是我的模块的代码(python_export.cpp):

#include <boost/python.hpp>
#include <CGAL/Exact_spherical_kernel_3.h>
#include "Sphere_intersecter.h" // header-only

typedef CGAL::Exact_spherical_kernel_3 SK;
template class Sphere_intersecter<SK>; // explicit for "-fno-implicit-templates"
typedef Sphere_intersecter<SK> SI;

BOOST_PYTHON_MODULE(thickness_diag)
{
    using namespace boost::python;
    class_<SI>("SphereIntersecter", no_init)
        .def("add_sphere", &SI::add_sphere)
    ;
}

和 CMakeLists.txt:

cmake_minimum_required(VERSION 2.6.2)
project(ThicknessDiag-Python)

# CGAL
find_package(CGAL REQUIRED)
include(${CGAL_USE_FILE})

# Boost
find_package(Boost REQUIRED COMPONENTS python)
find_package(PythonLibs 2.7 REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
include_directories(${PYTHON_INCLUDE_DIRS})

# Shared library
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-implicit-templates")
set(ThicknessDiag-Python "thickness_diag")
add_library(${ThicknessDiag-Python} SHARED python_export.cpp)
set_target_properties(${ThicknessDiag-Python} PROPERTIES PREFIX "")
target_link_libraries(${ThicknessDiag-Python}
    ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}
    ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES})

编译命令的详细输出:

[100%] Building CXX object CMakeFiles/thickness_diag.dir/python_export.cpp.o
/usr/bin/c++ -Dthickness_diag_EXPORTS -DCGAL_USE_MPFR -DCGAL_USE_GMP -frounding-math -fno-implicit-templates -O3 -DNDEBUG -fPIC -isystem /usr/local/include -I/usr/include/python2.7 -o CMakeFiles/thickness_diag.dir/python_export.cpp.o -c /home/jmcomets/ThicknessDiag/tests/python_export.cpp
Linking CXX shared library thickness_diag.so
/usr/bin/c++ -fPIC -frounding-math -fno-implicit-templates -O3 -DNDEBUG -shared -Wl,-soname,thickness_diag.so -o thickness_diag.so CMakeFiles/thickness_diag.dir/python_export.cpp.o -L/usr/local/lib -lmpfr -lgmp /usr/local/lib/libCGAL.so /usr/local/lib/libboost_thread.so -lpthread /usr/local/lib/libboost_system.so -lpython2.7 /usr/local/lib/libboost_python.so /usr/local/lib/libCGAL.so /usr/local/lib/libboost_thread.so -lpthread /usr/local/lib/libboost_system.so -lpython2.7 /usr/local/lib/libboost_python.so -Wl,-rpath,/usr/local/lib 

导入共享库的输出:

$ python -c 'import thickness_diag'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: ./thickness_diag.so: undefined symbol: _ZN5boost6python9converter6detail15registered_baseIRVK18Sphere_intersecterIN4CGAL18Spherical_kernel_3INS5_9CartesianINS5_4GmpqEEENS5_32Algebraic_kernel_for_spheres_2_3IS8_EEEEEE10convertersE
$ nm thickness_diag.so | grep _ZN5boost6python9converter6detail15registered_baseIRVK18Sphere_intersecterIN4CGAL18Spherical_kernel_3INS5_9CartesianINS5_4GmpqEEENS5_32Algebraic_kernel_for_spheres_2_3IS8_EEEEEE10convertersE
                 U _ZN5boost6python9converter6detail15registered_baseIRVK18Sphere_intersecterIN4CGAL18Spherical_kernel_3INS5_9CartesianINS5_4GmpqEEENS5_32Algebraic_kernel_for_spheres_2_3IS8_EEEEEE10convertersE

这两天我一直在努力解决这个问题,任何帮助都会很棒! :)

编辑:ldd 的输出

$ ldd thickness_diag.so
    linux-vdso.so.1 =>  (0x00007fffdfdff000)
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fd91eadf000)
    libCGAL.so.10 => /usr/local/lib/libCGAL.so.10 (0x00007fd91e8b4000)
    libboost_thread.so.1.55.0 => /usr/local/lib/libboost_thread.so.1.55.0 (0x00007fd91e699000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd91e47c000)
    libboost_system.so.1.55.0 => /usr/local/lib/libboost_system.so.1.55.0 (0x00007fd91e278000)
    libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0x00007fd91dd79000)
    libboost_python.so.1.55.0 => /usr/local/lib/libboost_python.so.1.55.0 (0x00007fd91db2c000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd91d829000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd91d612000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd91d253000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd91cf57000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd91cd4e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd91ef85000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd91cb37000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd91c933000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fd91c72f000)

好吧,我想通了。事实证明该选项-fno-implicit-templates阻止 boost 进行正常的模板实例化(这实际上非常明显)。

然后我又发现了一个我认为已经修复的错误:undefined symbol: _ZN18Sphere_intersecterIN4CGAL18Spherical_kernel_3INS0_9CartesianINS0_4GmpqEEENS0_32Algebraic_kernel_for_spheres_2_3IS3_EEEEEC1ERKS8_ (./thickness_diag.so)

其中,当翻译通过c++filt http://linux.die.net/man/1/c++filt,给出:Sphere_intersecter<...> >::Sphere_intersecter(Sphere_intersecter<...> const&)

未实现的复制构造函数(不可复制的类)...

解决方案是删除添加boost::noncopyable参数为boost::python::class_:

#include <boost/python.hpp>
#include <CGAL/Exact_spherical_kernel_3.h>
#include "Sphere_intersecter.h"

typedef CGAL::Exact_spherical_kernel_3 SK;
template class Sphere_intersecter<SK>;
typedef Sphere_intersecter<SK> SI;

BOOST_PYTHON_MODULE(thickness_diag)
{
    using namespace boost::python;
    class_<SI, boost::noncopyable>("SphereIntersecter")
        .def("add_sphere", &SI::add_sphere)
    ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Boost.Python 模块中未定义的符号 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • Spring Cloud Stream 应用程序 VS Spring Cloud Task 应用程序

    我正在探索 SCDF 来为我的系统编排现有的批处理任务 我注意到 SC Stream App Starters 已经提供了一些 OOTB 即可使用的流应用程序 这适合我的用例 从 FTP 中提取 xml 文件 gt ftp 源 定制改造 将
  • 当重复间隔设置为 1 秒(NSSecCalendarUnit)时,为什么本地通知会在 1 分钟后重复?

    我正在尝试安排一个本地通知 一旦通知被触发 该通知将每 1 秒重复一次 应用程序启动后 10 秒会触发通知 UILocalNotification notif cls alloc init notif fireDate NSDate all
  • 在 CSS 中创建多层 SVG 波浪

    我正在尝试在网站上创建波浪效果像这样 https dribbble com shots 5115653 Augmented reality web concept work attachments其中有一个主要颜色的波浪 深紫色 然后沿着边
  • 在不改变比例的情况下调整 Chrome 响应模式窗口的大小

    我以前可以打开开发人员工具 单击右下角的小图标打开响应模式 然后拖动窗口宽度手柄来更改设备宽度 这对于了解网站在不同设备上的表现非常有用 然而现在它只是改变了页面的比例 而不是宽度 这是垃圾 如何更改宽度并保持固定比例 EDIT 哦 可能不
  • Django haystack LocationField 创建为字符串而不是 elasticsearch 中的 geo_point

    我正在使用 django 1 8 9 django rest framework django haystack 和 Elasticsearch 并尝试让 LocationField 工作 索引已创建 但类型始终为string代替geo p
  • 只获取当前节点的文本

    在 Cheerio 中 如何仅获取当前节点的文本 var cheerio require cheerio const htmlString div hello span world span div cheerio load htmlStr
  • 检测 Outlook/回收状态并运行 Outlook 的多个实例

    有没有办法使用代码来检测 Outlook 是否会自动获取现有 Outlook 实例而不是启动新的 Outlook 实例 最好是 VBA 代码 理想情况下 还可以通过编程方式打开 关闭此行为 这里的目标是针对一组 Outlook 帐户中的数据
  • 调用 XSLT 模板并将所有输出保存到变量

    我想调用模板并将输出保存到变量中 我想保存ALL包括 HTML 标记的输出 但事实并非如此 例如 采用这个简单的 XSLT
  • 如何使 data.frame 中的组长度相等?

    我有这个数据框 df lt data frame id c A A B B B C amount c 45 66 99 34 71 22 id amount A 45 A 66 B 99 B 34 B 71 C 22 我需要扩展它以便每个b
  • 消息框挂起

    我试图在按下 winforms 应用程序上的按钮时显示消息框 但 MessageBox 挂起并且从不返回值 private void btnApply Click object sender EventArgs e bool current
  • 使用 UIAutomation 禁用 iOS 模拟器的硬件键盘

    我正在使用 UIAutomation 在 iOS 模拟器中进行一些自动化测试 在 Xcode 6 中 iOS 模拟器的键盘行为改变 https stackoverflow com a 26004815 700471为了与真实设备类似 现在有
  • 如何编写多个条件if else语句mips

    我会像编写将 C 转换为 mips 汇编的逻辑 OR 语句一样编写逻辑 AND 语句吗 else if i x j y printf c 219 这就是我放的 bne reg1 t3 draw219 i x bne reg2 t4 draw
  • 确定 Java 中的二进制/文本文件类型?

    也就是说 您如何区分存档 jar rar 等 文件和文本 xml txt 与编码无关 文件 没有保证的方法 但这里有几种可能性 查找文件上的标头 不幸的是 标头是特定于文件的 因此虽然您可能能够发现它是 RAR 文件 但您不会得到更通用的答
  • 在没有 swarm 的情况下限制 Docker compose 中的可用主机资源

    我只是想在 docker compose 文件中限制某些 Docker 容器的资源 原因很简单 主机上运行着多个应用程序 服务 所以我想避免单个容器可以使用例如所有内存 这会损害其他容器 从我了解到的文档中 这可以通过使用来完成resour
  • 用于电子邮件和页面其他部分链接的 HTML 标签

    我正在写一个HTML页面 我的要求如下 HTML 页面包含一些电子邮件 ID 当单击这些电子邮件 ID 时 它应该打开 Outlook 的新页面 页面有某些部分 当单击该部分时 它应该到达受尊重的段落 部分 例如 单击链接转到 部分 提前致
  • 在 Eclipse 项目中查找方法调用

    我有一个包含方法 myMethod 的类 X 我想在当前工作区的所有项目中找到调用 myMethod 的位置 我无法使用任何搜索函数 因为有多个类带有 myMethod 而且它不是静态的 因此 我需要知道此类的对象的名称 如果不手动探索项目
  • Jquery AJAX:如何更改“成功”按钮的值?

    我在一页上有多个按钮 单击后 我跟踪按钮 ID 将按钮值发送到后端 php 代码 该代码通过更改数据库返回更新的值 我能够取回我需要的一切 除了 成功设置按钮值 这是我正在使用的代码 document ready function inpu
  • 表单提交后验证重置

    我有带有复选框的表单 我希望用户至少选择其中之一 一切正常 但重置表单后我无法隐藏验证消息 这种情况在docs https logaretm github io vee validate guide forms html programma
  • 多个应用程序可以访问 SQLite 数据库吗?

    我遇到了一些数据库锁 SQLite BUSY 麻烦 我担心 SQLite 不适合我 基本上 我的设置是一个 cronjob 它定期调用一些不引人注目的 Java 功能和 项目中的新功能 通过一个名为 Jetty Jackson Hibern
  • Boost.Python 模块中未定义的符号

    我正在尝试使用 Boost Python 为模板库的某个实例构建一个小型 Python 扩展 该库广泛使用 CGAL 库 它与 CMake 集成得相当好 因此我将其用于我的项目 这是我的模块的代码 python export cpp inc