我使用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 ++标志:
构建会导致以下错误:
重复符号__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查看调用)
如果我将编译器标志更改为以下内容,则可以正常工作:
问题是boost :: errinfo_api_function对象,但我不明白为什么?
我希望有人可以帮助我。
亲切的问候 格奥尔格