Dear readers,

I encountered a problem in my project when using Boost.Exception with the predefined types errinfo_xyz in a library project. I have two classes ClassA and ClassB in my library which both throw a boost::exception with errinfo_api_function type in their implementation file (.cpp) These both classes are compiled into a static library with the C/C++-Flags -fvisibility=hidden.
Then I have a main.cpp which creates an instance of ClassA and ClassB and links to the library which contains ClassA.o and ClassB.o. When I compile the main.cpp I get the linker error duplicate symbol for the errinfo_api_function object in ClassA.o and ClassB.o. If I remove the visibility=hidden flag, it links without problems. I am not an expert on the compiler flags, but I saw that many libraries use the visibility=hidden flag so I think it would be good, if my lib could also use it.   

For a better description I will show the sources for my project:

ClassA.h
-------------------------------------------------------------------------------------------------
#pragma once

#include <boost/exception/all.hpp>

struct my_errorA : virtual std::exception, virtual boost::exception {};

class ClassA
{
public:
  ClassA() {};
  virtual ~ClassA() {};

  virtual void doSomething();
};

ClassA.cpp
-------------------------------------------------------------------------------------------------
#include "ClassA.h"

void ClassA::doSomething()
{
  BOOST_THROW_EXCEPTION( my_errorA() << 
     boost::errinfo_api_function("doSomething") );
}

ClassB.h
-------------------------------------------------------------------------------------------------
#pragma once
#include <boost/exception/all.hpp>

struct my_errorB : virtual std::exception, virtual boost::exception {};

class ClassB
{
public:
  ClassB() {};
  virtual ~ ClassB() {};

  virtual void doSomething();
};

ClassB.cpp
-------------------------------------------------------------------------------------------------
#include "ClassB.h"

void ClassB::doSomething()
{
  BOOST_THROW_EXCEPTION( my_errorB() << 
     boost::errinfo_api_function("doSomething") );
}

main.cpp
-------------------------------------------------------------------------------------------------
#include "ClassA.h"
#include "ClassB.h"

int main(int argc, const char * argv[])
{
  ClassA A;
  ClassB B;

  return 0;
}

The Linker output:
-----------------------------------------------------------------------------------------------------------------
Ld /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/ExceptionTest normal i386
    cd /Users/georg/work/ExceptionTest
    setenv MACOSX_DEPLOYMENT_TARGET 10.8
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug -F/Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug -filelist /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Intermediates/ExceptionTest.build/Debug/ExceptionTest.build/Objects-normal/i386/ExceptionTest.LinkFileList -mmacosx-version-min=10.8 /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/libExceptionLib.a -o /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/ExceptionTest
duplicate symbol __ZTIPN5boost21errinfo_api_function_E in:
    /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/libExceptionLib.a(ClassA.o)
    /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/libExceptionLib.a(ClassB.o)
duplicate symbol __ZTSPN5boost21errinfo_api_function_E in:
    /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/libExceptionLib.a(ClassA.o)
    /Users/georg/Library/Developer/Xcode/DerivedData/ExceptionTest-dcnvciwqbwqvciaokkjjaqchftll/Build/Products/Debug/libExceptionLib.a(ClassB.o)
ld: 2 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
-----------------------------------------------------------------------------------------------------------------

I hope I described the problem well enough and I hope someone can explain what the problem is? Thank a lot and

best regards
Georg