我有一个主要的方法,
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方法时,所有内容都会编译,或者将所有定义保留在头文件中,我很难过。
答案 0 :(得分:2)
您已在MyStruct.h
和main.cpp
中加入了MyStruct.cpp
。
包含基本上是复制粘贴,只留下2个翻译单元(main.cpp
和MyStruct.cpp
),它们都包含function1
和function2
的定义(因为你包括两个头文件。
解决方案:
仅在头文件中声明函数,并仅在一个翻译单元中定义它们。