Re: Cpp Name mangling under visual 8
Joseph M. Newcomer a ?crit :
Without much of a clue, it appears to be parameter specification. Show the declaration of
the function you think it is linking to, the call, and the declarations of all variables
involved in the call.
joe
On Mon, 21 May 2007 14:29:39 +0200, mosfet <john.doe@anonymous.org> wrote:
Hi,
I am trying to compile log4cpp under pocket pc.
I have done some modifications to get it to compile on this platform and
now I have a linker error :
testmain.obj : error LNK2019: unresolved external symbol "public:
__cdecl log4cpp::Win32DebugAppender::Win32DebugAppender(class
std::basic_string<char,struct std::char_traits<char>,class
std::allocator<char> > const &)"
(??0Win32DebugAppender@log4cpp@@QAA@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
referenced in function wmain
It seems testmain cannot find
??0Win32DebugAppender@log4cpp@@QAA@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
appender = new log4cpp::Win32DebugAppender(std::string("default"));
I have dumped exported symbols from log4cpp.lib and I get this :
??0Win32DebugAppender@log4cpp@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z
the only difference is @@QAE@ instead of @@QAA@. So my question is what
does it mean ?
I am using visual studio 2005.
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
In log4cpp source :
#ifdef LOG4CPP_HAS_DLL
# ifdef LOG4CPP_BUILD_DLL
# define LOG4CPP_EXPORT __declspec(dllexport)
# else
# define LOG4CPP_EXPORT __declspec(dllimport)
# endif
#else
# define LOG4CPP_EXPORT
#endif
//Win32DebugAppender.hh
namespace log4cpp {
class LOG4CPP_EXPORT Win32DebugAppender : public LayoutAppender {
public:
/**
* Constructor.
* @param name Name used by the base classes only.
*/
Win32DebugAppender(const std::string& name);
/**
* Destructor.
*/
virtual ~Win32DebugAppender();
/**
* Close method. This is called by the framework, but there is nothing
* to do for the OutputDebugString API, so it simply returns.
*/
virtual void close();
protected:
/**
* Method that does the actual work. In this case, it simply sets up
the layout
* and calls the OutputDebugString API.
* @param event Event for which we are logging.
*/
virtual void _append(const LoggingEvent& event);
};
}
in my sample app :
#ifdef _WIN32_WCE
int _tmain(int argc, TCHAR* argv[])
#else
int main(int argc, TCHAR** argv)
#endif
{
log4cpp::Appender* appender;
if (argc < 2) {
appender = new log4cpp::OstreamAppender(std::string("default"), &std::cout);
} else
{
char szBuff[256];
::wcstombs( szBuff, argv[1], 256);
appender = new log4cpp::Win32DebugAppender(std::string("default"));
//appender = new log4cpp::FileAppender(std::string("default"), szBuff);
}