Poco 1.4.2 在Windows平台下使用时link报错 "CreateProcess is not defined"的解决


Poco 1.4.2 在Windows平台下使用时link报错 "CreateProcess is not defined"


原因:Poco库中 undef 了 CreateProcess 宏


ps, 定位问题的过程:

0 ) 刚开始不知道这个问题是POCO库引起的...

1) 查看 MSDN CreateProcess 的说明,确保本工程定义的WINVER, _WIN32_WINNT, _WIN32_WINDOWS, _WIN32_IE 版本确实能使用 CreateProcess 

2 )   郁闷了

3 )  自己在.cpp中加入 CreateProcess 的宏定义,发现问题解决了...

#ifndef CreateProcess
//#error "why CreateProcess is not defined?"
// Why???
#ifdef _UNICODE
#define CreateProcess CreateProcessW
#else
#define CreateProcess CreateProcessA
#endif // _UNICODE
#endif

4 ) 上面的解决方法看起来太猥琐了...

5 ) 由上可证,问题是由于 CreateProcess 宏没有定义引起的

6 )  在调用了CreateProcess  函数的.cpp文件的头部加入:

#ifundef CreateProcess
#error "why???"
#endif

编译,发现在最顶部的时候不会走到 #error "why???"

 不停的当把这3句代码,从上往下移;当移到 #include 之后时,发现走到 #error "why???"

7)由上可知,CreateProcess宏本来是定义了的。蛋是,在引入Poco的头文件后,该宏被undef了。


8) google,发现 Poco 库在处理Unicode/ANSI的时候用的自己的机制(POCO_WIN32_UTF8),CreateProcess 定义为CreateProcessA/W可能和Poco的定义冲突。具体见Foundation\include\Poco\UnWindows.h头部的注释。在UnWindows.h中undef了某些 CreateProcess 等宏定义。



【解决办法】当在Windows平台下需要使用以下函数时,需要在包含Poco的头文件之前, #define POCO_NO_UNWINDOWS 

#define POCO_NO_UNWINDOWS
#include 


ps, Poco 库中undef掉的宏包括:

#if !defined(POCO_NO_UNWINDOWS)
// A list of annoying macros to #undef.
// Feel free to extend as required.
#undef GetBinaryType
#undef GetShortPathName
#undef GetLongPathName
#undef GetEnvironmentStrings
#undef SetEnvironmentStrings
#undef FreeEnvironmentStrings
#undef FormatMessage
#undef EncryptFile
#undef DecryptFile
#undef CreateMutex
#undef OpenMutex
#undef CreateEvent
#undef OpenEvent
#undef CreateSemaphore
#undef OpenSemaphore
#undef LoadLibrary
#undef GetModuleFileName
#undef CreateProcess
#undef GetCommandLine
#undef GetEnvironmentVariable
#undef SetEnvironmentVariable
#undef ExpandEnvironmentStrings
#undef OutputDebugString
#undef FindResource
#undef UpdateResource
#undef FindAtom
#undef AddAtom
#undef GetSystemDirector
#undef GetTempPath
#undef GetTempFileName
#undef SetCurrentDirectory
#undef GetCurrentDirectory
#undef CreateDirectory
#undef RemoveDirectory
#undef CreateFile
#undef DeleteFile
#undef SearchPath
#undef CopyFile
#undef MoveFile
#undef ReplaceFile
#undef GetComputerName
#undef SetComputerName
#undef GetUserName
#undef LogonUser
#undef GetVersion
#undef GetObject
#endif // POCO_NO_UNWINDOWS



你可能感兴趣的:(C/C++开源库使用)