多个编译单元中使用的C ++库会导致链接器错误

时间:2014-08-13 12:45:39

标签: c++ xcode clang

我一直在研究一个更大的项目,并且在将其重构为多个编译单元时,偶然发现了一个问题。 每个编译单元都包含一个它需要的自定义库,它们都正常编译,但是当Xcode尝试链接时,链接器会抛出许多重复的符号错误。

该库也由多个文件组成,其中一些文件需要彼此。以下是库文件编写方式的示例。

文件1:

// lib.hpp
#ifndef LIB1_HPP_
#define LIB1_HPP_

namespace lib1
{
    class Class1
    {
        void foo (int a);
    }
}
#endif

文件2:

// lib.cpp

#include "lib.hpp"

lib1::Class1:foo (int a)
{
    return ...;
}

包含的唯一文件是.hpp文件,.cpp文件使用-c编译并添加到Xcode中的项目中。

提到的错误是(更改的函数名称与本文中的函数名称相匹配):

duplicate symbol __ZN5lib13Class5_fooE in:
/Users/---/Library/Developer/Xcode/DerivedData/Project-haivawxacqnzswdyqtfrxlrqlakt/Build/Intermediates/Project.build/Debug/Project.build/Objects-normal/x86_64/file.o

错误出现多次,因为库中有多个函数,但它总是一样的。

2 个答案:

答案 0 :(得分:0)

你应该添加

#pragma once 

#ifndef Class1_h
#define Class1_h

... your declarations ...

#endif

答案 1 :(得分:0)

问题是我错误地使用extern的问题。我刚刚修好了。