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

C++ Boost.Python模块中未定义的符号,c++,cmake,boost-python,C++,Cmake,Boost Python,我正在尝试使用Boost.Python为模板库的某个实例化构建一个小型Python扩展。这个库广泛使用CGAL库,它与CMake集成得相当好,因此我在我的项目中使用它 下面是我的模块(python_export.cpp)的代码: #包括 #包括 #仅包括“球体相交点h”//标题 typedef CGAL::精确球形内核3 SK; 模板类球体_相交;//“fno隐式模板”的显式 typedef Sphere_相交SI; BOOST_PYTHON_模块(厚度图) { 使用名称空间boost::pyt

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

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

#包括
#包括
#仅包括“球体相交点h”//标题
typedef CGAL::精确球形内核3 SK;
模板类球体_相交;//“fno隐式模板”的显式
typedef Sphere_相交SI;
BOOST_PYTHON_模块(厚度图)
{
使用名称空间boost::python;
类(“SphereIntersecter”,无初始化)
.def(“添加_球体”,&SI::添加_球体)
;
}
以及CMakeLists.txt:

cmake_最低要求(2.6.2版)
项目(ThicknessDiag Python)
#CGAL
查找程序包(需要CGAL)
包括(${CGAL\u USE\u FILE})
#促进
find_包(Boost-REQUIRED-COMPONENTS-python)
find_包(需要PythonLibs 2.7)
include_目录(${Boost_include_DIRS})
include_目录(${PYTHON_include_DIRS})
#共享库
设置(CMAKE_CXX_标志“${CMAKE_CXX_标志}-fno隐式模板”)
设置(厚度诊断Python“厚度诊断”)
添加库(${ThicknessDiag Python}共享Python\u export.cpp)
设置\u目标\u属性(${ThicknessDiag Python}属性前缀“”)
目标链接库(${ThicknessDiag Python}
${PYTHON_库}${Boost_库}
${CGAL_图书馆}${CGAL_第三方图书馆})
compile命令的详细输出:

[100%]构建CXX对象CMakeFiles/thickness\u diag.dir/python\u export.cpp.o
/usr/bin/c++-Dthickness\u diag\u EXPORTS-DCGAL\u USE\u MPFR-DCGAL\u USE\u GMP-fronting math-fno隐式模板-O3-DNDEBUG-fPIC-isystem/usr/local/include-I/usr/include/python2.7-o CMakeFiles/thickness\u diag.dir/python\u export.cpp-c/home/jmcomets/ThicknessDiag/tests/python\u export.cpp
链接CXX共享库厚度\u diag.so
/usr/bin/c++-fPIC-frounding math-fno implicit templates-O3-DNDEBUG-shared-Wl-soname,thickness_diag.so-o thickness_diag.so cmakfiles/thickness_diag.dir/python_export.cpp.o-L/usr/local/lib-lmpfr-lgmp/usr/local/libCGAL.so/usr/local/libboost_thread.so-lpthread/usr/local/lib/libboost_-system.so-lpython2.7/usr/local/lib/libboost_-python.so/usr/local/lib/lib/lib/lib/libboost-cgu-thread/usr/local/lib/libboost_system.so-lpython2.7/usr/local/lib/libboost_python.so-Wl,-rpath,/usr/local/lib
导入共享库的输出:

$python-c“导入厚度\u诊断”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
导入错误:./thickness\u diag.so:未定义符号:\u zn5boost6python9converter6detail15注册的\u baseIRVK18Sphere\u intersecterin4gal18sphere\u kernel\u 3INS5\u cartesian5\u 4mpqeens5\u 32spheres\u 3的代数\u kernel\u是8\ueeeeeee 10 converter
$nm厚度诊断so | grep | ZN5boost6python9converter6detail15registered(注册)baseIRVK18Sphere(球面)相交4 GAL18球面(球面)内核(笛卡尔坐标)5(球面)内核)的代数(内核)是8(eeeeeeeee 10 converterse
uzn5boost6python9converter6detail15registered\ubaseirvk18sphere\u2u intersecterin4gal18sphere\u2u kernel\u3ins5\u4mpqeens5\u32spheres的代数\u2u kernel\u2\u3is8\ueeeee 10 converterse
在过去的两天里,我一直在努力解决这个问题,任何帮助都会很棒的!:)

编辑: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)
这是什么意思?是的


在您的
so
上尝试
ldd
。这将告诉您它使用的所有库。然后,您需要确保所有库都在
LD\u LIBRARY\u路径上

好的,我找到了。事实证明,
-fno implicit templates
选项阻止了boost执行其正常的模板实例化(这实际上是非常明显的)

然后,我又回到了一个我认为已修复的错误上:
未定义的符号:\u ZN18Sphere\u intersecterin4cGal18sphere\u kernel\u 3INS0\u 9CartesianINS0\u 4gmpqeens0\u 32球面的代数\u kernel\u 3IS3\ueeeee c1erks8\u(/厚度\u diag.so)

当通过进行转换时,将给出:
球体相交>::球体相交(球体相交常数&)

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

解决方案是删除将
boost::noncopyable
参数添加到
boost::python::class.

#包括
#包括
#包括“球面_相交点.h”
typedef CGAL::精确球形内核3 SK;
模板类球面相交;
typedef Sphere_相交SI;
BOOST_PYTHON_模块(厚度图)
{
使用名称空间boost::python;
类(“球体接口”)
.def(“添加_球体”,&SI::添加_球体)
;
}

我编辑了问题并添加了ldd的输出,我正在检查是否所有库都在那里,但一切似乎都正常。如何设置获取这些库的路径?我不知道。也就是说,
LD\u LIBRARY\u路径
为默认值(空)。CMake添加了
-L/usr/local/lib
-Wl,-rpath、/usr/local/lib
,如果我没有弄错的话,所有库都在标准目录中。
$man nm
...
"U" The symbol is undefined.