2010-01-25 7 views
13

Estoy convirtiendo una biblioteca estática basada en ATL en una DLL y obtengo la siguiente advertencia en cualquier clase exportada que use la clase ATL CString (encontrado en atlstr.h):Advertencia C4251 al compilar una DLL que exporta una clase que contiene un miembro ATL :: CString

advertencia C4251: 'Foo :: str_': clase 'ATL :: CStringT' necesita tener DLL-Adaptador para su uso por los clientes de clase 'Foo'

Estoy declarando correctamente la clase Foo como e xported vía __declspec(dllexport). ¿Es esta una advertencia que puedo ignorar sin problemas o estoy haciendo algo mal? La configuración del proyecto DLL está configurada para vincular dinámicamente con ATL, pero esto no parece hacer ninguna diferencia.

Por ejemplo:

#ifdef DLLTEST_EXPORTS 
#define DLLTEST_API __declspec(dllexport) 
#else 
#define DLLTEST_API __declspec(dllimport) 
#endif 

// This class is exported from the DLLTest.dll 
class DLLTEST_API Foo 
{ 
public: 
Foo(); 
CString str_; // WARNING C4251 HERE 
}; 

Todos los clientes de esta DLL también estarán usando ATL.

+0

Si usted es capaz de garantizar tanto la biblioteca y el cliente está construido en la misma versión de la biblioteca ATL, lo que puede ignorarlo. –

Respuesta

15

This thread da lo que considero una mejor respuesta, por Doug Harrison (VC++ MVP):

[Esta advertencia se] emite cuando se utiliza una clase X no dllexported en una Y. clase dllexported ¿Qué tiene de malo sobre eso? Bueno, supongamos que Y tiene una función en línea y_f que llama a una función x_f que pertenece a X que es y que no está en línea. Si y_f está en línea dentro de un cliente que no está estáticamente enlaza X, el enlace fallará, porque no se encontrará x_f.

+2

El enlace se eliminó. – laishiekai

+0

Cita relacionada: http://www.qtforum.org/article/36372/warning-c4251.html –

+0

@WillBickford: Gracias, pensé que la discusión original se había perdido hace mucho tiempo ... –

5

Here is a thread con una buena discusión de esto.

En resumen, el compilador le advierte que, en efecto, su clase exportada no separa la interfaz de la implementación. Si los miembros en cuestión no son accesibles para los clientes, hágales privados y #pragma aleje la advertencia para ese miembro/clase. Si los miembros son accesibles y utilizados por los clientes, entonces deberá proporcionar acceso indirecto a los miembros a través de los usuarios de acceso y mutadores.

+3

Entonces, si los objetos advertidos ya son privados para la clase, podemos ignorar esta advertencia con seguridad – meawoppl

1

Normalmente recibo esta advertencia cuando cometo el tonto error de compilar el archivo DLL con la biblioteca de tiempo de ejecución Single/Multithreaded en lugar de Single/MultithreadedDLL. Es posible que desee comprobar eso en la configuración de su proyecto.

Cuestiones relacionadas