2015-10-16 87 views
1

我在我的程序中使用了boost::filesystem::is_directory(),問題是當我使用選項-DBOOST_FILESYSTEM_VERSION=3編譯我的程序時,程序無法正常運行。升級版本是1.44.0。boost1.44.0 filesystem v3無法在solaris sparc 64bit平臺上正常運行

具體來說,我用下面的命令建立文件系統庫:

./bjam --toolset=gcc define=BOOST_FILESYSTEM_VERSION=3 --with-filesystem stage 

我建立我的程序像這樣的命令。

g++ -I boost_1_44_0_folder test.cpp -o test boost_1_44_0_folder/stage/lib/libboost_filesystem.a boost_1_44_0_folder/stage/lib/libboost_system.a -DBOOST_FILESYSTEM_VERSION=3 

當我執行./test時,結果是「不是目錄」。

但是,如果我用這樣的命令構建我的程序。

g++ -I boost_1_44_0_folder test.cpp -o test boost_1_44_0_folder/stage/lib/libboost_filesystem.a boost_1_44_0_folder/stage/lib/libboost_system.a 

當我執行./test時,結果是「is dir」。

而我的測試代碼顯示如下。

test.cpp

#include <boost/filesystem.hpp> 
#include <iostream> 
using namespace std; 
int main() { 
    namespace bf = boost::filesystem; 
    bf::path p("/home"); 
    if (!boost::filesystem::is_directory(p)) { 
     cout << "is not dir" << endl; 
    } else { 
     cout << "is dir" << endl; 
    } 
    return 0; 
} 
+0

'/ home'是一個目錄嗎?它是符號鏈接嗎?一個掛載點? – sehe

+0

爲其他目錄,它是一樣的。 – Jz2015

+0

你使用的是什麼GCC版本? Boost將推動幾乎所有C++編譯器的限制,而Oracle附帶的Solaris版本往往有點過時。 (如果你使用的是Solaris發佈的Solaris版本,那真的是過時了......) –

回答

0

您可能還需要升級你的加速版本。如果你看一下源代碼(例如:http://svn.boost.org/svn/boost/trunk/boost/wave/util/filesystem_compatibility.hpp)有很多在1.0.46版本1.0.50,並在文件系統處理的變化,有很多的代碼看起來像這樣:

#if BOOST_FILESYSTEM_VERSION >= 3 
#if BOOST_VERSION >= 105000 
     return boost::filesystem::complete(p, base); 
#else 
     return boost::filesystem3::complete(p, base); 
#endif 
#else 
     return boost::filesystem::complete(p, base); 
#endif 

FWIW,這個代碼在operations.cpp(http://svn.boost.org/svn/boost/trunk/libs/filesystem/src/operations.cpp)真正困擾我:

// both stats now known to be valid 
return s1.st_dev == s2.st_dev && s1.st_ino == s2.st_ino 
    // According to the POSIX stat specs, "The st_ino and st_dev fields 
    // taken together uniquely identify the file within the system." 
    // Just to be sure, size and mod time are also checked. 
    && s1.st_size == s2.st_size && s1.st_mtime == s2.st_mtime; 

因此,如果你如果兩個文件實際上是與升壓相同的文件檢查,他們真的是相同的文件,但它被寫入或即使只是touch'd在錯誤的時刻,Boost將返回該文件本身不是。除了沒有正確識別普通的簡單目錄之外,並沒有給我對Boost文件系統實現的其他部分充滿信心。

+0

嗨安德魯,謝謝你的回答。我想我已經找到了根本原因。它是一個提升1.44.0文件系統v3的bug。您可能會看到#5355號票。 https://svn.boost.org/trac/boost/ticket/5355 – Jz2015