您可以使用宏创建如下代码:
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:
您需要使用GetFileVersionInfoEx API 或GetFileVersionInfo API 查询DLL 的版本,您还需要考虑操作系统是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() 函数将指向正确的函数:)