2017-09-09 1 views
0

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?

Répondre

1

Les modèles ne peuvent pas être exportés à partir de DLL, évidemment.

Copier-coller ce que vous avez essayé d'exporter et de la signature:

template<typename PointType, typename PointRfType> void 
computeRf 
(const boost::shared_ptr<const pcl::PointCloud<PointType> > &input, pcl::PointCloud<PointRfType> &rf) 

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>) 

Je remarque une différence. Vous avez essayé d'exporter quelque chose dont les arguments de fonction ne sont pas des références. La méthode template de la classe template a des arguments de fonction de référence.

Le compilateur a déclaré "ceux-ci ne correspondent pas". Je vais le croire.

Définissez les références d'arguments et cela correspond à une méthode de la classe.

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>&) 
+0

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. –

0

Vous avez deux erreurs dans la ligne de instantiatrion:

pour
  1. argument modèle Hough3DGrouping est erroné, devrait être

    pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::PointXYZRGB, pcl::ReferenceFrame 
    

    et non

    pcl::PointXYZRGB, pcl::PointXYZRGB, pcl::ReferenceFrame, pcl::ReferenceFrame 
    
  2. Vous j'ai oublié & s dans la liste des paramètres:

    computeRf(const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB>>&, 
          pcl::PointCloud<pcl::ReferenceFrame>&) 
    

    arguments de modèle de computeRf ne sont pas nécessaires parce que fonctionne la déduction.

+0

Merci! L'ordre des arguments était correct. J'ai juste dû ajouter des & dans la liste des paramètres pour la compiler. Mais je ne vois toujours pas la fonction computeRf() dans les symboles d'exportation DLL. Une idée pourquoi? –