[filesystem] patch for path.hpp for "Duplicate symbol" problem on HP-UX and Tru64

Vladimir Prus wrote:
Boris, since this a patch for boost.filesystem, I think you better post it to Boost mailing list, not Boost.Build mailing list. We don't have the authority to approve boost.filesystem patches here.
Posting to the right list. Thanks, Vladimir! ---------------------------------------------------------------------------- On HP-UX and Tru64, when using CVS HEAD, linking of process_jam_log fails because of multiply defined symbol. From ld output on HP-UX, for example: ld: Duplicate symbol "boost::filesystem::basic_filesystem_error<boost:: filesystem::basic_path<std::basic_string<char,std::char_traits<char>, std::allocator<char> >,boost::filesystem::path_traits> >::what() const" The duplicate symbol is coming from the explicit specialization in boost/filesystem/path.hpp conditionalized for anything but gcc with the following comment: // TODO: Figure out why this specialization is causing problems with GCC #ifndef __GNUC__ ... With aCC (HP-UX) and cxx (Tru64), this specialization is causing linker's muldef if several modules include header file with the specialization. According to reproducer below, this is the same problem with gcc also, although I don't know what "problems with GCC" the comment above refers to. This specialization does not cause a problem with Intel compiler for Itanium: see output for intel_ecc and iVMS below. Attached patch fixes the problem on HP-UX/aCC and Tru64/cxx by extending condition under which the specialization is not provided (before the fix, it was not provided for gcc only). I verified that it fixes the problem on the aforementioned platforms. Ok to commit? Thanks, Boris path.hpp -------- class path; template<class T> class basic_filesystem_error { const char * what() const throw(); }; template<> const char * basic_filesystem_error<path>::what() const throw() { return 0; } x.cpp ----- #include "path.hpp" int main() {} y.cpp ----- #include "path.hpp" bash-2.03$ aCC -V aCC: HP C/aC++ B3910B A.06.14 [Feb 22 2007] bash-2.03$ aCC x.cpp y.cpp x.cpp: y.cpp: ld: Duplicate symbol "basic_filesystem_error<path>::what() const" in files x.o and y.o 1 errors. bash-2.03$ g++ x.cpp y.cpp ld: Duplicate symbol "basic_filesystem_error<path>::what() const" in files /var/tmp//ccvXAxka.o and /var/tmp//ccWe5Xga.o 1 errors. collect2: ld returned 1 exit status bash-2.03$ cxxosf.zko.hp.com> cxx -V Compaq C++ V7.1-006 for Compaq Tru64 UNIX V5.1B (Rev. 2650) Compiler Driver V7.1-006 (cxx) cxx Driver cxxosf.zko.hp.com> cxx x.cpp y.cpp x.cpp: y.cpp: ld (prelink): y.o compressed: basic_filesystem_error<path>::what(void) const : multiply defined ld: y.o compressed: basic_filesystem_error<path>::what(void) const : multiply defined cxxosf.zko.hp.com> icc.zko.hp.com> $DECC_BIN/intel_ecc -V Intel(R) C Itanium(R) Compiler for Itanium(R)-based applications Version 9.0 Build 20060221 Built Jun 19 2006 17:12:01 by cbldr on icc.zko.dec.com in /usr/proj/decc7/decc/intel_builds/latest/dev Copyright (C) 1985-2006 Intel Corporation. All rights reserved. icc.zko.hp.com> $DECC_BIN/intel_ecc x.cpp y.cpp icc.zko.hp.com> ICXX::_1> cxx/ver HP C++ X7.3-100 on OpenVMS IA64 V8.3 ICXX::_1> cxx x.cpp ICXX::_1> cxx y.cpp ICXX::_1> link x.obj, y.obj ICXX::_1> Index: path.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/filesystem/path.hpp,v retrieving revision 1.24 diff -u -d -r1.24 path.hpp --- path.hpp 3 Nov 2006 16:57:29 -0000 1.24 +++ path.hpp 18 Apr 2007 20:33:16 -0000 @@ -611,8 +611,8 @@ boost::shared_ptr<m_imp> m_imp_ptr; }; -// TODO: Figure out why this specialization is causing problems with GCC -#ifndef __GNUC__ +// This specialization is causing problems with GCC, aCC (HP-UX) and cxx on Alpha. +#if !(defined(__GNUC__) || defined(__HP_aCC) || (defined(__DECCXX) && defined(__alpha))) template<> const char * basic_filesystem_error<path>::what() const throw() { if ( !m_imp_ptr.get() ) return system_error::what();
participants (1)
-
Boris Gubenko