您可以使用宏来创建一些代码,如下所示:
std::cout << "Using Boost "
<< BOOST_VERSION / 100000 << "." // maj. version
<< BOOST_VERSION / 100 % 1000 << "." // min. version
<< BOOST_VERSION % 100 // patch version
<< std::endl;
这适用于 boost 1.51.x 及更高版本。不确定这是否是您正在寻找的,我会继续看看是否有办法以更优雅的方式从当前加载的 dll 中获取它。
附录:
要查找运行时版本:
查看 Boost 系统后,您似乎可以做您正在寻找的事情的最简单方法是拥有平台相关代码,该代码在编译时使用来生成不同版本的可执行文件。
对于 Windows:
您需要使用以下命令查询 DLL 的版本获取文件版本信息Ex API http://msdn.microsoft.com/en-us/library/aa969434%28VS.85%29.aspx or 获取文件版本信息 API http://msdn.microsoft.com/en-us/library/ms647003%28VS.85%29.aspx,您还需要考虑操作系统是 32 位还是 64 位,因此这里有一些可能有用的代码:
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS IsWow64ProcessFunc;
BOOL is64BitOS()
{
BOOL retval= FALSE;
// need to check if the OS is 64 bit, and we cant therefore indiscrimately call the 64 bit function for this, so we use the following:
IsWow64ProcessFunc= (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if(IsWow64ProcessFunc != NULL)
{
if (!IsWow64ProcessFunc(GetCurrentProcess(),&bIsWow64))
{
// your error handling code in here
}
}
return retval;
}
然后我们可以使用简单的代码来获取 DLL 的版本:
void myWindowsDLLVersionChecker()
{
DWORD versionHandle = NULL;
UINT size = 0;
LPBYTE buffer = NULL;
DWORD versionSize = GetFileVersionInfoSize( szVersionFile, &versionHandle);
if (verSize != NULL)
{
LPSTR versionData = new char[versionSize];
if (GetFileVersionInfo( szVersionFile, versionHandle, versionSize, versionData))
{
if (VerQueryValue(versionData,"\\",(VOID FAR* FAR*)&buffer,&size))
{
if (size)
{
VS_FIXEDFILEINFO *versionInfo = (VS_FIXEDFILEINFO *)buffer;
if (versionInfo->dwSignature == 0xFEEF04BD) // value from http://msdn.microsoft.com/en-us/library/windows/desktop/ms646997(v=vs.85).aspx
{
if(is64BitOS()) // if it is true then its a 64 bit Windows OS
{
major = (versionInfo->dwProductVersionMS >> 16) & 0xff;
minor = (versionInfo->dwProductVersionMS >> 0) & 0xff;
revision = (versionInfo->dwProductVersionLS >> 16) & 0xff;
build = (versionInfo->dwProductVersionLS >> 0) & 0xff;
}
else // 32 bit Windows OS
{
major = HIWORD(versionInfo->dwProductVersionMS);
minor = LOWORD(versionInfo->dwProductVersionMS);
revision = HIWORD(versionInfo->dwProductVersionLS);
build = LOWORD(versionInfo->dwProductVersionLS);
}
}
}
}
}
delete[] versionData;
}
}
对于Linux:
目前非常不记得代码了,但是这是记忆中的部分解决方案(我现在手头没有 Linux 机器,稍后会更详细地检查这一点,但最多只需要进行少量修改即可工作)。
void myLinuxDLLVersionChecker()
{
// call readelf as an external proces son libboost_system.so,
// and use the information returned to extract the version from.
// or use something like
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libboost_system.so");
// information from http://linux.die.net/man/8/ld.so
// the above pretty much replicates ldd's output, so you can pick out the version
}
结合两者:
要使相同的事情在多个操作系统中发生,您可能必须使用类似的东西:
#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */
void detectBoostDllVersion() // does not have to be void, can be whatever you need
{
myLinuxDLLVersionChecker();
}
#elif defined(_WIN32) || defined(WIN32) /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */
void detectBoostDllVersion() // has to match the same return type as the previous version
{
myWindowsDLLVersionChecker();
}
#endif
现在,根据编译的操作系统,正确的函数将由detectBoostDLLVersion()
功能 :)