what the warning mean?

Started by
5 comments, last by wah_on_2 20 years, 8 months ago
Hi, i am writing utilities, but the compile produced warnings when i compile the following code. What does it mean? Why it occur? And how can i solve it? Thx a lot of. ------ Rebuild All started: Project: Utility, Configuration: Debug Win32 ------ Deleting intermediate files and output files for project ''Utility'', configuration ''Debug|Win32''. Compiling... Utility.cpp Exception.cpp h:\LongRunner\C++\Utility\Exception.h(14) : warning C4251: ''LongRunner::Utility::CException::m_ClassName'' : class ''std::basic_string<_Elem,_Traits,_Ax>'' needs to have dll-interface to be used by clients of class ''LongRunner::Utility::CException'' with [ _Elem=char, _Traits=std::char_traits, _Ax=std::allocator ] h:\LongRunner\C++\Utility\Exception.h(15) : warning C4251: ''LongRunner::Utility::CException::m_MethodName'' : class ''std::basic_string<_Elem,_Traits,_Ax>'' needs to have dll-interface to be used by clients of class ''LongRunner::Utility::CException'' with [ _Elem=char, _Traits=std::char_traits, _Ax=std::allocator ] h:\LongRunner\C++\Utility\Exception.h(16) : warning C4251: ''LongRunner::Utility::CException::m_Message'' : class ''std::basic_string<_Elem,_Traits,_Ax>'' needs to have dll-interface to be used by clients of class ''LongRunner::Utility::CException'' with [ _Elem=char, _Traits=std::char_traits, _Ax=std::allocator ] Generating Code... Linking... Creating library Debug/Utility.lib and object Debug/Utility.exp Build log was saved at "file://h:\LongRunner\C++\Utility\Debug\BuildLog.htm" Utility - 0 error(s), 3 warning(s) ---------------------- Done ---------------------- Rebuild All: 1 succeeded, 0 failed, 0 skipped

//UtilityStdhdr.h


#ifndef _Utilitystdhdr_H_
#define _Utilitystdhdr_H_

#include<string>
#include<vector>

namespace LongRunner
{
namespace Utility
{
#define DllExport __declspec(dllexport)
using namespace std;
}
}
#endif



//Exception.h


#ifndef _Exception_H_
#define _Exception_H_

#include "Utilitystdhdr.h"

namespace Longrunner
{
namespace Utility
{
	class DllExport CException
	{
	//data members

	protected:
		string  m_ClassName;
		string  m_MethodName;
		string	m_Message;


	//methods

	public:
		CException(const char *className, const char *methodName, const char *message);
		virtual ~CException(void);

		//property

		inline const char *ClassName(){		return m_ClassName.c_str();		};
		inline const char *MethodName(){	return m_MethodName.c_str();	};
		inline const char *Message(){		return m_Message.c_str();		};
		};
}
}
#endif
Advertisement
if you have:

class NoDllInterface{...};__declspec(dllexport) class ExportedClass{ NoDllInterface InstanceOfClass; // warning !!}


The warning says that you export a class that has no DLL interface (the class itself is not exported). The following code solves this problem:

__declspec(dllexport) class DllInterface{...};__declspec(dllexport) class ExportedClass{ DllInterface InstanceOfClass;}
Except in this case the author is not going to modify his STL headers. One HOPES he wouldn''t, at least.

I believe you can safely ignore it for STL classes.
--God has paid us the intolerable compliment of loving us, in the deepest, most tragic, most inexorable sense.- C.S. Lewis
In fact, i can work property with those warnings if i ignore. However, will the warnings cause problems in runtime?

Also, can i disable this warning on compile time?
#pragma warning(disable:4251) to kill the warning

Shouldn''t as long as the machine has the necessary DLL files (check redist.txt for a list of those)
--God has paid us the intolerable compliment of loving us, in the deepest, most tragic, most inexorable sense.- C.S. Lewis
Ok. Thx a lot of. ^^
Hi, I have question again.

I am confusing the output format of the utility classess.

I know i have 4 choices.
1: I just wrting the classes and if the other programs use the classes, just include the .cpp and .h files.
2: I write a static library and if the other program use the classes, just include the header file and link with the .lib
3: I create a dll file and export the function. If the other program use the classes, just use LoadLibrary() and GetProcAddres() to get the function pointer.
4: I create a dll file and if the other program use the classes, just include the header file and link with the lib. And run with the dll file.

However, i don''t know the benfits and the drawback of each one. (I just know i must re-compile the other programs when the utilities classes have small change(e.g. change variable name in a function) in the choice4 but choice3 need not.

Which one is better? Can explain its to me? Thx

This topic is closed to new replies.

Advertisement