1

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

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

以下是课程:

类A.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();
};

A类.cpp

#include "ClassA.h"

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

B类.h

#pragma once
#include "ClassA.h"

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

  virtual void doSomething();
};

B类.cpp

#include "ClassB.h"

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

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

主文件

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

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

  ClassA A;
  ClassB B;

  return 0;
}

C++ 标志:

在此处输入图像描述

构建导致以下错误:

重复符号 __ZTIPN5boost21errinfo_api_function_E 在:/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 在:/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:架构 i386 的 2 个重复符号 clang:错误:链接器命令失败退出代码 1(使用 -v 查看调用)

如果我将编译器标志更改为以下内容,它将起作用:

在此处输入图像描述

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

我希望有一个人可以帮助我。

亲切的问候乔治

4

0 回答 0