直到一周前,我一直在我的项目中使用Boost 1.46.1。将所有内容升级到Boost 1.55.0之后,我注意到某些功能与以前不同。
我的软件加载通过SymLinks放置的配置文件。我正在使用微软mklink来做这件事。
我今天发现虽然版本1.46.1中的boost::filesystem::is_empty()
正在为我的链接返回false
,但它现在在1.55.0中返回true
。不幸的是,我无法更改使用该代码的组件。结果是我的配置文件不再被加载。
更新
回应评论的更多信息:
fopen
并阅读其内容UPDATE2:
我刚创建了一个包含所有内容的Github项目来重新创建问题。我使用VS 2013 Express编译程序:
答案 0 :(得分:1)
问题是Windows上旧版本的Boost文件系统(V2)使用VC ++的stat()
函数来获取目标文件的信息,该函数遵循符号链接。
较新版本的文件系统库(V3)使用Win32 GetFileAttributesExW()
API,并且不遵循符号链接,因此路径指定的对象大小将返回为0.
It looks like文件系统V3在Boost 1.46中成为默认值,并且在1.48中从库中删除了V2。解决问题的一个可能方法是在1.48之前返回Boost版本(并且可能构建将BOOST_FILESYSTEM_VERSION
宏设置为2的库。)
我已经针对此问题打开了一个错误,错误报告中包含针对libs/filesystem/src/operations.cpp
的修补程序修复问题:
请记住,我在错误报告中提交的补丁没有太多测试(例如,它需要针对其他版本的Windows进行测试,使用MinGW工具链,其路径包含ASCII范围之外的字符,目录作为目标,可能还有许多其他我没想过的事情)。但是,如果您想继续使用最近的Boost版本,欢迎您修补本地Boost库,看看它是否能解决您的问题。