2010-05-06 13 views
18

Estoy usando la biblioteca OpenCV y uno de sus archivos de encabezado, cxoperations.hpp, genera "warning C4793: 'anonymous namespace'::CV_XADD' : function compiled as native", si mi proyecto C++ se compila con soporte CLR. Puedo evitar la advertencia rodeando la cabecera OpenCV incluir la siguiente manera:¿Cómo manejan las personas la advertencia C4793: 'some_function': función compilada como nativa?

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

Pero el proyecto que realmente utiliza OpenCV no está compilado con soporte CLR, es una biblioteca estática nativo C++. El proyecto que tiene soporte CLR y genera esta advertencia sin las declaraciones pragma, simplemente usa esta biblioteca estática. Así que estoy un poco sorprendido de que la advertencia haya sido creada en absoluto, especialmente dado el hecho de que toda la biblioteca estática no está compilada con soporte CLR, y sin embargo, es solo este encabezado el que causa el problema.

Por lo tanto, esta solución no me parece óptima. ¿Es así como manejarías esta advertencia o podrías recomendar una mejor práctica?

+0

posible que desee considerar la adición de una etiqueta "C++/CLI". –

Respuesta

14

creo que lo que quiere es la siguiente:

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

Un proyecto de C++/CLI puede contener ambas partes administrados y no administrados, y el compilador se encarga de los datos de clasificación entre el 2 por usted. Los puntos de entrada administrados se podrán llamar desde las aplicaciones .NET normales (como C# y el resto) y usarán la recolección de elementos no utilizados, y llamarán a las funciones no administradas para hacer el trabajo pesado.

+0

¿Hay alguna diferencia entre las declaraciones pragma que publiqué y las que sugirió? No pude encontrar nada en línea para decir claramente de una forma u otra, aunque me parece que tienen el mismo efecto. –

+0

No estoy seguro, pero así es como lo he visto en MSDN. – Blindy

+1

Después de un poco de uso, he encontrado que esta construcción es ligeramente inferior a la óptima. Es decir, si utiliza esta construcción en código compilado sin soporte CLR, devuelve la advertencia C4949, mientras que la construcción push-pop no da ninguna advertencia. –

3

Creo que deberías suprimir la advertencia. El documento MSDN establece explícitamente que los pragmas administrados/no administrados no se deben usar antes de las instrucciones include.

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

Si no puede cambiar los archivos de código existente, usted puede deshacerse de la advertencia deshabilitando el soporte CLR para el archivo específico que muestra warning 4793. Por supuesto, esto solo funciona si este archivo no hace uso de las características de CLR.

Para deshabilitar la compatibilidad con CLR para un archivo específico, ubíquelo en el Explorador de soluciones, haga clic con el botón derecho y abra sus Páginas de propiedades. Establecer Common Language RunTime Support a No Common Language RunTime Support. No olvides hacer esto para Todas las configuraciones y Todas las plataformas.

Turn off CLR support per file

Cuestiones relacionadas