LLVM编译器标志visibility = hidden时出现重复的符号链接器错误

时间:2013-10-01 08:08:06

标签: c++ boost linker static-libraries llvm

我使用LLVM Clang编译器使用Xcode 4.6.2进行静态库构建时遇到问题。仅当我使用C / C ++编译器标志visibility = hidden时才会出现此问题。链接器报告我重复的符号错误。我将在一个简单的场景中解释设置,我希望有人能解释为什么会发生这种情况。

想象一下,我有两个类ClassA和ClassB,我编译成静态库myLib。如上所述,我设置了Compiler标志-fvisibility = hidden。 然后我有一个项目,它从使用myLib的main.cpp创建一个可执行文件。

以下是课程:

ClassA.h

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

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

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

  virtual void doSomething();
};

ClassA.cpp

#include "ClassA.h"

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

ClassB.h

#pragma once
#include "ClassA.h"

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

  virtual void doSomething();
};

ClassB.cpp

#include "ClassB.h"

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

这两个类构建到我的库中没有问题。在我链接myLib的可执行项目中,我有以下main.cpp

的main.cpp

#include <iostream>
#include "ClassA.h"
#include "ClassB.h"

int main(int argc, const char * argv[])
{

  ClassA A;
  ClassB B;

  return 0;
}

C ++标志:

enter image description here

构建会导致以下错误:

  

重复符号__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)   重复符号__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个用于体系结构i386 clang的重复符号:错误:链接器   命令失败,退出代码为1(使用-v查看调用)

如果我将编译器标志更改为以下内容,则可以正常工作:

enter image description here

问题是boost :: errinfo_api_function对象,但我不明白为什么?

我希望有人可以帮助我。

亲切的问候 格奥尔格

0 个答案:

没有答案