我使用点云库(PCL)编写了一个程序。现在我想使用一些cgal的算法。我已经设法独立地构建了一个cgal类(所有依赖项都可以工作等),但当我尝试将这两个项目组合在一起时,我会遇到未解决的外部符号错误
那么,我有什么选择来构建一个cgal项目并从我的PCL项目访问它呢?我会把一个简单的向量传递给cgal项目,所以理论上没有一个专业库需要相互交互。我已经尝试将它构建成一个静态和动态库,但据我所知,在这样做的时候,我仍然需要包括所有的cgal依赖项——这再次打破了局面。
有关未解决外部事件的更多信息:
我使用这个CGAL示例做了一个简单的项目(VS2010),使用CMAKE添加所需的依赖项:CGAL组件(包括QT)、TAUCS、LAPACK、BLAS。这个项目建设得很愉快。如果我添加对PCL库的引用:
include_directories (${PCL_INCLUDE_DIRS})
link_directories (${PCL_LIBRARY_DIRS} )
add_definitions (${PCL_DEFINITIONS})
现在,当我尝试构建时,我得到了四个未解决的外部:
poisson.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void * __cdecl boost::detail::get_tss_data(void const *)" (__imp_?get_tss_data@detail@boost@@YAPAXPBX@Z) referenced in function "public: class CGAL::Lazy<class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> > >,class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Gmpq> >,class CGAL::Gmpq,class CGAL::Cartesian_converter<struct CGAL::Simple_cartesian<class CGAL::Gmpq>,struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> >,struct CGAL::NT_converter<class CGAL::Gmpq,class CGAL::Interval_nt<0> > > > * __thiscall boost::thread_specific_ptr<class CGAL::Lazy<class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> > >,class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Gmpq> >,class CGAL::Gmpq,class CGAL::Cartesian_converter<struct CGAL::Simple_cartesian<class CGAL::Gmpq>,struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> >,struct CGAL::NT_converter<class CGAL::Gmpq,class CGAL::Interval_nt<0> > > > >::get(void)const " (?get@?$thread_specific_ptr@V?$Lazy@V?$Point_3@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@CGAL@@@CGAL@@V?$Point_3@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@@2@VGmpq@2@V?$Cartesian_converter@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@2@U?$NT_converter@VGmpq@CGAL@@V?$Interval_nt@$0A@@2@@2@@2@@CGAL@@@boost@@QBEPAV?$Lazy@V?$Point_3@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@CGAL@@@CGAL@@V?$Point_3@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@@2@VGmpq@2@V?$Cartesian_converter@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@2@U?$NT_converter@VGmpq@CGAL@@V?$Interval_nt@$0A@@2@@2@@2@@CGAL@@XZ)
poisson.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl boost::detail::set_tss_data(void const *,class boost::shared_ptr<struct boost::detail::tss_cleanup_function>,void *,bool)" (__imp_?set_tss_data@detail@boost@@YAXPBXV?$shared_ptr@Utss_cleanup_function@detail@boost@@@2@PAX_N@Z) referenced in function "public: void __thiscall boost::thread_specific_ptr<class CGAL::Lazy<class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> > >,class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Gmpq> >,class CGAL::Gmpq,class CGAL::Cartesian_converter<struct CGAL::Simple_cartesian<class CGAL::Gmpq>,struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> >,struct CGAL::NT_converter<class CGAL::Gmpq,class CGAL::Interval_nt<0> > > > >::reset(class CGAL::Lazy<class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> > >,class CGAL::Point_3<struct CGAL::Simple_cartesian<class CGAL::Gmpq> >,class CGAL::Gmpq,class CGAL::Cartesian_converter<struct CGAL::Simple_cartesian<class CGAL::Gmpq>,struct CGAL::Simple_cartesian<class CGAL::Interval_nt<0> >,struct CGAL::NT_converter<class CGAL::Gmpq,class CGAL::Interval_nt<0> > > > *)" (?reset@?$thread_specific_ptr@V?$Lazy@V?$Point_3@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@CGAL@@@CGAL@@V?$Point_3@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@@2@VGmpq@2@V?$Cartesian_converter@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@2@U?$NT_converter@VGmpq@CGAL@@V?$Interval_nt@$0A@@2@@2@@2@@CGAL@@@boost@@QAEXPAV?$Lazy@V?$Point_3@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@CGAL@@@CGAL@@V?$Point_3@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@@2@VGmpq@2@V?$Cartesian_converter@U?$Simple_cartesian@VGmpq@CGAL@@@CGAL@@U?$Simple_cartesian@V?$Interval_nt@$0A@@CGAL@@@2@U?$NT_converter@VGmpq@CGAL@@V?$Interval_nt@$0A@@2@@2@@2@@CGAL@@@Z)
poisson.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::system_category(void)" (__imp_?system_category@system@boost@@YAABVerror_category@12@XZ) referenced in function "public: __thiscall boost::thread_exception::thread_exception(int,char const *)" (??0thread_exception@boost@@QAE@HPBD@Z)
poisson.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (__imp_?generic_category@system@boost@@YAABVerror_category@12@XZ) referenced in function "void __cdecl boost::system::`dynamic initializer for 'posix_category''(void)" (??__Eposix_category@system@boost@@YAXXZ)
在过去,我已经能够解决大多数这些问题,但这些问题让我大吃一惊,因此我想知道我是否可以创建两个交互但不必共享不兼容的库的项目。
OP在评论部分解决了自己的问题。
我尝试了很多不同的东西,包括升级我的助推版本更改为1.55,并将我的CGAL代码作为静态库进行引用。我已经最后通过重新构建CGAL来使用静态提升库(与PCL一样)。