C ++,Clang:#including与cpp相关联的头文件无法编译

时间:2018-02-20 15:26:01

标签: c++ compiler-errors compilation cmake

我有一个主要的方法,

main.cpp:

#include "MyStruct.h"

MyStruct.h:

#ifndef MYPROJ_MYSTRUCT_H
#define MYPROJ_MYSTRUCT_H
#include <vector>
#include <unordered_map>

bool function1(std::vector<std::string> label){ 
    // actual implementation     
}
bool function2(...){ ... }

struct MyStruct{ ... }
#endif

这个编译。但是,当我添加cpp文件以包含函数定义时,

main.cpp: 

#include "MyStruct.h"

MyStruct.h:

#ifndef MYPROJ_MYSTRUCT_H
#define MYPROJ_MYSTRUCT_H
#include <vector>

bool function1(...){ ... }
bool function2(...){ ... }

struct MyStruct{ ... }
#endif

MyStruct.cpp:

#include "MyStruct.h"

// and that's it

只是包含头文件,我得到链接器错误,就像我多次导入头一样;

以下是CMakeLists:

cmake_minimum_required(VERSION 3.8)
set(CMAKE_CXX_STANDARD 17)

set(SOURCE_FILES main.cpp MyStruct.cpp)
add_executable(my_proj ${SOURCE_FILES})

错误包含所有重复的符号错误。我不知道如何让它工作,因为这是我一直使用make和g ++做的事情而不会遇到问题;当我在Cygwin / Windows上使用CMake和g ++(这是在MacOSX上)时,我似乎也没有这个问题。

接下来,当我将所有函数转换为.cpp文件,并且标题中只有声明时,我删除了大多数重复符号,除了:

duplicate symbol __Z8get_uvidv in:
    CMakeFiles/main.cpp.o
    CMakeFiles/MyStruct.cpp.o
duplicate symbol _uvid in:
    CMakeFiles/main.cpp.o
    CMakeFiles/MyStruct.cpp.o
ld: 2 duplicate symbols for architecture x86_64

更新资源

// header: MyStruct.h

#ifndef MYPROJ_MYSTRUCT_H
#define MYPROJ_MYSTRUCT_H

#include <unordered_map>
#include <vector>
#include "AnotherStruct.h"

bool add_item(std::pair<std::string,float> & item);
void insert_item(std::vector<AnotherStruct> & A, std::pair<std::string,float> element);
...

struct MyStruct {
    std::unordered_map<std::string,int> labels;
    std::vector<AnotherStruct> data;

    MyStruct(std::vector<char *> inputs);

    void GetData();
    void SortData(bool (*compare)(AnotherStruct &,AnotherStruct &);
    //...
}
#endif

.cpp

#include "MyStruct.h"

// implement everything declared in .h 
bool add_item(...){
    ...
}
bool insert_item(...){
    ...
} 

MyStruct::MyStruct(...){
    ...
}
void MyStruct::GetData(...){
    ...
}
void MyStruct::SortData(...){
    ...
}

主要:

#include "MyStruct.h"

错误:

duplicate symbol __Z8get_uvidv in: 
    main.cpp.o
    MyStruct.cpp.o
duplicate symbol _uvid in:
    main.cpp.o
    MyStruct.cpp.o

不知道 __Z8get_uvidv可能是什么,也不是_uvid,所以我假设std imports或者下面发生了一些事情。关于编译器的引擎盖。

请记住,当我将其复制到main方法时,所有内容都会编译,或者将所有定义保留在头文件中,我很难过。

1 个答案:

答案 0 :(得分:2)

您已在MyStruct.hmain.cpp中加入了MyStruct.cpp

包含基本上是复制粘贴,只留下2个翻译单元(main.cppMyStruct.cpp),它们都包含function1function2的定义(因为你包括两个头文件。

解决方案:

仅在头文件中声明函数,并仅在一个翻译单元中定义它们。