2010-05-06 14 views
18

J'utilise la bibliothèque OpenCV et l'un de ses fichiers d'en-tête, cxoperations.hpp, génère "warning C4793: 'anonymous namespace'::CV_XADD' : function compiled as native", si mon projet C++ est compilé avec le support CLR. Je peux empêcher l'avertissement en entourant l'en-tête de OpenCV inclure comme ceci:Comment les gens gèrent-ils l'avertissement C4793: 'some_function': fonction compilée en natif?

#pragma managed(push,off) 
#include <cv.h> 
#pragma managed(pop) 

Mais le projet qui utilise en fait OpenCV n'est pas compilé avec le support CLR, il est bibliothèque statique d'un natif C. Le projet qui prend en charge CLR et génère cet avertissement sans les instructions pragma utilise simplement cette bibliothèque statique. Je suis donc un peu surpris que l'avertissement ait été créé, d'autant plus que toute la bibliothèque statique n'est pas compilée avec le support du CLR, et pourtant c'est seulement cet en-tête qui cause le problème.

Ainsi cette solution me semble sous-optimale. Est-ce la façon dont vous traiteriez cet avertissement, ou pouvez-vous recommander une meilleure pratique?

+0

voudrez peut-être envisager d'ajouter une balise "C++/CLI". –

Répondre

14

Je pense que ce que vous voulez est le suivant:

#pragma unmanaged 
#include <cv.h> 
#pragma managed 
// managed code wrapping unmanaged opencv functions 

Un projet C++/CLI peut contenir les deux gérés et non gérés parties, et le compilateur prend en charge les données de triage entre les deux pour vous. Les points d'entrée gérés seront appelables à partir d'applications .NET normales (comme C# et le reste) et utiliseront la récupération de place, et ils appellent des fonctions non gérées pour effectuer le gros du travail.

+0

Y a-t-il une différence entre les déclarations pragma que j'ai publiées et celles que vous avez suggérées? Je n'ai rien trouvé en ligne pour dire clairement d'une façon ou d'une autre, bien qu'ils me paraissent avoir le même effet. –

+0

Je ne sais pas, mais c'est comme ça que j'ai vu ça dans MSDN. – Blindy

+1

Après un peu d'utilisation, j'ai trouvé cette construction légèrement sous-optimale. C'est-à-dire que si vous utilisez cette construction dans du code compilé sans support CLR, elle renvoie l'avertissement C4949, alors que la construction push-pop ne donne aucun avertissement. –

3

Je pense que vous devriez supprimer l'avertissement. Le document MSDN indique explicitement que les pragmas gérés/non gérés ne doivent pas être utilisés avant les instructions include.

#pragma warning(disable: 4793) // methods are compiled as native (clr warning) 
#include <cv.h> 
#pragma warning(pop) 
1

Si vous ne pouvez pas modifier les fichiers de code existant, vous pouvez vous débarrasser de l'avertissement par la désactivation du support CLR pour le fichier spécifique qui montre warning 4793. Bien sûr, cela ne fonctionne que si ce fichier n'utilise pas les fonctionnalités CLR.

Pour désactiver la prise en charge de CLR pour un fichier spécifique, localisez-le dans l'Explorateur de solutions, cliquez avec le bouton droit de la souris et ouvrez ses pages de propriétés. Définir Prise en charge Common Language RunTime à Aucune prise en charge Common Language RunTime. Ne pas oublier de le faire pour Toutes les configurations et Toutes les plates-formes.

Turn off CLR support per file