Je compile la bibliothèque PCL (https://github.com/PointCloudLibrary/pcl.git) dans des DLL à utiliser dans mon propre projet. C'est un projet qui utilise beaucoup les modèles C++. Afin de diminuer le temps de compilation, j'utilise PCL_NO_PRECOMPILE
mis à OFF
, ce qui signifie que l'implémentation n'est pas dans les fichiers d'en-tête. Mon application ne peut utiliser que les classes et les fonctions qui ont été instanciées lors de la compilation de PCL.Exportation d'une fonction membre modélisée d'une classe modélisée dans MSVC C++ DLL
Le problème est que les fonctions membres modélisées d'une classe basée sur un modèle ne sont pas exportées dans la DLL MSVC. J'utilise MS Visual Studio 2017 édition communautaire. Voici le problème spécifique.
Je crée une classe enfant de pcl::Hough3DGrouping
, définie à https://github.com/PointCloudLibrary/pcl/blob/master/recognition/include/pcl/recognition/cg/hough_3d.h. La fonction spécifique d'intérêt est la fonction protégée computeRf()
définie au bas du fichier sur la ligne 510. Lorsque je regarde les symboles exportés dans la DLL, je ne vois pas computeRf()
. Par conséquent, je ne suis pas en mesure de l'utiliser à partir de mon code personnalisé.
J'ai supposé que computeRf()
n'est pas exporté dans la DLL car il est basé sur un modèle. Par conséquent, j'ai essayé l'instanciation explicite dans https://github.com/PointCloudLibrary/pcl/blob/master/recognition/src/cg/hough_3d.cpp. Spécifiquement j'ai ajouté
template void pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>::computeRf<pcl::PointXYZRGB, pcl::ReferenceFrame>(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >, pcl::PointCloud<pcl::ReferenceFrame>)
sur la ligne 44 de https://github.com/PointCloudLibrary/pcl/blob/master/recognition/src/cg/hough_3d.cpp.
Quand je compile, je reçois l'erreur:
E:\libs\pcl\src\recognition\src\cg\hough_3d.cpp(45): error C3190: 'void pcl::Hough3DGrouping<pcl::PointXYZRGB,pcl::PointXYZRGB,pcl::ReferenceFrame,pcl::ReferenceFrame>::computeRf(const boost::shared_ptr<const pcl::PointCloud<PointT>>,pcl::PointCloud<PointModelRfT>)' with the provided template arguments is not the explicit instantiation of any member function of 'pcl::Hough3DGrouping<pcl::PointXYZRGB,pcl::PointXYZRGB,pcl::ReferenceFrame,pcl::ReferenceFrame>'
with
[
PointT=pcl::PointXYZRGB,
PointModelRfT=pcl::ReferenceFrame
]
Mon but est de créer une classe d'enfants de pcl::Hough3DGrouping
dans ma demande et appeler la méthode computeRf()
de la classe de base de celle-ci. Les seuls instanciations j'ai besoin sont:
pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>
pcl::Hough3DGrouping<pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame>::computeRf<pcl::PointXYZRGB, pcl::ReferenceFrame>
Comment dois-je prendre pour faire cela avec un minimum de changements au code source PCL?
Vous avez raison. L'ajout de & aide à compiler le code. Mais même après cela, je ne vois pas la fonction computeRf() dans la DLL. –