Boost logo

Boost :

From: Boris Gubenko (Boris.Gubenko_at_[hidden])
Date: 2007-04-19 10:04:04


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();


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk