[filesytem].[aix].[1_34_0] related issue

Hi, // samp.cpp Boost Library Example #include <iostream> #include <string> #include <cstdlib> #include <fstream> #include "boost/filesystem/operations.hpp" #include "boost/filesystem/path.hpp" #include "boost/filesystem/exception.hpp" #include "boost/filesystem/convenience.hpp" #include "boost/filesystem/fstream.hpp" using namespace std; int main( int argc, char* argv[] ) { if ( argc != 2 ) { std::cout << "Usage: file_size path\n"; return 1; } std::cout << "sizeof(intmax_t) is " << sizeof(boost::intmax_t) << '\n'; boost::filesystem::path p( argv[1], boost::filesystem::native ); if ( !boost::filesystem::exists( p ) ) { std::cout << "not found: " << argv[1] << std::endl; return 1; } if ( boost::filesystem::is_directory( p ) ) { std::cout << "not a file: " << argv[1] << std::endl; return 1; } std::cout << "size of " << argv[1] << " is " << boost::filesystem::file_size( p ) << std::endl; return 0; } I tried to build the above sample which comes with BOOST File System library on AIX 5.3. It got failed at link time. The detail of this activity is as follow: Compiler Details: XL C/C++ Enterprise Edition V9.0 OS Details:- AIX 5.3 Boost Version:- 1_34_0 (32 bit build) Command for building the boost libraries:- $bjam --v2 install toolset=vacpp --prefix=$HOME/1_34_1/32 --builddir=$HOME/tmp variant=release runtime-link=static,shared threading=single,multi --without-python Jamfile.v2 "samp.cpp":- Compilation Command $xlC_r -q32 -I/home/1_34_0/include samp.cpp -L/home/1_34_0/lib -lboost_filesystem-xlc-mt-1_34 ld: 0711-317 ERROR: Undefined symbol: .boost::filesystem::detail::last_write_time_api( const std::basic_string<char,std::char_traits<char>,std::allocator<char>
&,int) ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
I tried to find a solution on google and came across with the following: http://beta.boost.org/development/tests/trunk/output/IBM_Canada_Ltd-boos t-bin-v2-libs-filesystem-test-operations_test_dll-test-vacpp-debug.html Even the regression test result on IBM site indicates that the certain test case of file system library isn't working: http://www-1.ibm.com/support/docview.wss?rs=2030&context=SSJT9L&uid=swg2 7010184 I am not directly using the "boost::filesystem::detail::last_write_time_api" in my code, but I am not sure whether any other API's which I am using in my code, is using it indirectly. Can somebody suggest me a work around to resolve this? Regards, Gaurav Jain "There are two ways to write error-free programs; only the third works." -Alan J. Perlis DISCLAIMER: This message contains privileged and confidential information and is intended only for an individual named. If you are not the intended recipient, you should not disseminate, distribute, store, print, copy or deliver this message. Please notify the sender immediately by e-mail if you have received this e-mail by mistake and delete this e-mail from your system. E-mail transmission cannot be guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete or contain viruses. The sender, therefore, does not accept liability for any errors or omissions in the contents of this message which arise as a result of e-mail transmission. If verification is required, please request a hard-copy version.

"Gaurav Jain-SJR" <Gaurav.Jain@iflexsolutions.com> wrote on 11/19/2007 06:58:42 AM:
[snip]
I am not directly using the "boost::filesystem::detail::last_write_time_api" in my code, but I am not sure whether any other API's which I am using in my code, is using it indirectly.
Can somebody suggest me a work around to resolve this?
The Boost.filesystem operations_test shows the same error message. Adding a -G to the link step should resolve this problem. Chris Cambly XL C++ Compiler Development

"Gaurav Jain-SJR" <Gaurav.Jain@iflexsolutions.com> wrote on 11/19/2007 06:58:42 AM:
Hi,
// samp.cpp Boost Library Example #include <iostream> #include <string> #include <cstdlib> #include <fstream> #include "boost/filesystem/operations.hpp" #include "boost/filesystem/path.hpp" #include "boost/filesystem/exception.hpp" #include "boost/filesystem/convenience.hpp" #include "boost/filesystem/fstream.hpp" using namespace std;
int main( int argc, char* argv[] ) {
if ( argc != 2 ) { std::cout << "Usage: file_size path\n"; return 1; }
std::cout << "sizeof(intmax_t) is " << sizeof(boost::intmax_t) << '\n';
boost::filesystem::path p( argv[1], boost::filesystem::native );
if ( !boost::filesystem::exists( p ) ) { std::cout << "not found: " << argv[1] << std::endl; return 1; }
if ( boost::filesystem::is_directory( p ) ) { std::cout << "not a file: " << argv[1] << std::endl; return 1; }
std::cout << "size of " << argv[1] << " is " << boost::filesystem::file_size( p ) << std::endl; return 0; }
I tried to build the above sample which comes with BOOST File System library on AIX 5.3. It got failed at link time. The detail of this activity is as follow:
Compiler Details: XL C/C++ Enterprise Edition V9.0
OS Details:- AIX 5.3
Boost Version:- 1_34_0 (32 bit build)
Command for building the boost libraries:-
$bjam --v2 install toolset=vacpp --prefix=$HOME/1_34_1/32 --builddir=$HOME/tmp variant=release runtime-link=static,shared threading=single,multi --without-python Jamfile.v2
"samp.cpp":- Compilation Command
$xlC_r -q32 -I/home/1_34_0/include samp.cpp -L/home/1_34_0/lib -lboost_filesystem-xlc-mt-1_34
ld: 0711-317 ERROR: Undefined symbol: .boost::filesystem::detail::last_write_time_api( const std::basic_string<char,std::char_traits<char>,std::allocator<char>
&,int) ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
Disregard my advice for using the -G option, that option is for shared libraries and likely just deferred the missing symbol until load time. Let me take another look at the problem. The loadmap shows that the symbol is referenced by operations_test.o (likely in samp.o in your case), but no definition for the symbol exists. Chris Cambly IBM XL Compiler Development

"Gaurav Jain-SJR" <Gaurav.Jain@iflexsolutions.com> wrote on 11/19/2007 06:58:42 AM:
Hi,
// samp.cpp Boost Library Example #include <iostream> #include <string> #include <cstdlib> #include <fstream> #include "boost/filesystem/operations.hpp" #include "boost/filesystem/path.hpp" #include "boost/filesystem/exception.hpp" #include "boost/filesystem/convenience.hpp" #include "boost/filesystem/fstream.hpp" using namespace std;
int main( int argc, char* argv[] ) {
if ( argc != 2 ) { std::cout << "Usage: file_size path\n"; return 1; }
std::cout << "sizeof(intmax_t) is " << sizeof(boost::intmax_t) << '\n';
boost::filesystem::path p( argv[1], boost::filesystem::native );
if ( !boost::filesystem::exists( p ) ) { std::cout << "not found: " << argv[1] << std::endl; return 1; }
if ( boost::filesystem::is_directory( p ) ) { std::cout << "not a file: " << argv[1] << std::endl; return 1; }
std::cout << "size of " << argv[1] << " is " << boost::filesystem::file_size( p ) << std::endl; return 0; }
I tried to build the above sample which comes with BOOST File System library on AIX 5.3. It got failed at link time. The detail of this activity is as follow:
Compiler Details: XL C/C++ Enterprise Edition V9.0
OS Details:- AIX 5.3
Boost Version:- 1_34_0 (32 bit build)
Command for building the boost libraries:-
$bjam --v2 install toolset=vacpp --prefix=$HOME/1_34_1/32 --builddir=$HOME/tmp variant=release runtime-link=static,shared threading=single,multi --without-python Jamfile.v2
"samp.cpp":- Compilation Command
$xlC_r -q32 -I/home/1_34_0/include samp.cpp -L/home/1_34_0/lib -lboost_filesystem-xlc-mt-1_34
ld: 0711-317 ERROR: Undefined symbol: .boost::filesystem::detail::last_write_time_api( const std::basic_string<char,std::char_traits<char>,std::allocator<char>
&,int) ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
I tried to find a solution on google and came across with the following:
http://beta.boost.org/development/tests/trunk/output/IBM_Canada_Ltd-boos t-bin-v2-libs-filesystem-test-operations_test_dll-test-vacpp-debug.html
Even the regression test result on IBM site indicates that the certain test case of file system library isn't working:
http://www-1.ibm.com/support/docview.wss?rs=2030&context=SSJT9L&uid=swg2 7010184
I am not directly using the "boost::filesystem::detail::last_write_time_api" in my code, but I am not sure whether any other API's which I am using in my code, is using it indirectly.
Can somebody suggest me a work around to resolve this?
Regards, Gaurav Jain
The symbol referenced from operations_test.cpp, or in your case samp.cpp is: boost::filesystem::detail::last_write_time_api(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&,int) the symbol defined in the archive of Boost.Filesystem is: boost::filesystem::detail::last_write_time_api(const std::basic_string<char,std::char_traits<char>,std::allocator<char> >&,long) The problem originates with the last parameter, std::time_t, of the function boost::filesystem::detail::last_write_time_api(). In the Boost.Filesystem header, boost/filesystem/operations.hpp the function last_write_time() is declared as: last_write_time( const Path & ph, const std::time_t new_time) where std::time_t is typedef'ed to time_t which is defined as an int in /usr/include/time.h. However, inside libs/filesystem/src/operations.cpp where the definition of the function last_write_time() resides there is some code which changes the underlying type of time_t to a long ie) // enable the XPG-compliant version of readdir_r() on AIX #if defined(_AIX) # define _LINUX_SOURCE_COMPAT #endif This #define of _LINUX_SOURCE_COMPAT changes the time_t from an int to a long. So the declaration of last_write_time() has std::time_t as an int whereas the definition has std::time_t as a long, thus the link error message. There are two ways to fix this: 1) Compile samp.cpp with -D_LINUX_SOURCE_COMPAT but be warned this changes more than time_t 2) The best fix is to remove the define for LINUX_SOURCE_COMPAT and add checks around the call to readdir_r to make sure that _AIX and __THREAD_SAFE ie) the thread safe version of the compiler on AIX is being called so readdir_r() works correctly. Here is a libs/filesystem/src/operations.cpp patch for Boost trunk: (See attached file: operations.cpp.trunk.patch) Here is a libs/filesystem/src/operations.cpp patch for Boost.1.34.1: (See attached file: operations.cpp.1.34.patch) Chris Cambly IBM XL Compiler Development
participants (2)
-
Christopher Cambly
-
Gaurav Jain-SJR