C++,Clang:#包括与 cpp 关联的头文件不编译

克里斯

我有一个主要的方法,

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 上使用带有 g++ 的 CMake 时,我似乎也没有这个问题(这是在 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 方法或将所有定义保留在头文件中时,一切都会编译,我很难过。

戴帽子的公鸡

您已包含MyStruct.hmain.cpp和 中MyStruct.cpp

包括基本没有复制粘贴,让你有2个翻译单元(main.cppMyStruct.cpp),这两个包含定义function1function2(因为你同时包括在头文件)。

解决方案:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在实现(.cpp)文件中不包括相应的头文件(.h)仍可以编译吗?

C++ 编译不同的 .cpp 文件,将它们包含在头文件中

用头文件编译不同的.cpp文件

将C ++类分为头文件和cpp文件

将C ++(.cpp)编译为.exe文件

C ++使用cpp中的头文件中的引用函数?

包括一个* .cpp文件

c++ 模板特征——编译时不包含头文件

OSX cpp(clang)错误:没有这样的文件或目录:'c'

在 .cpp 中调用 .c 文件

编译-链接.cpp和头文件时出错

编译cpp文件时代码未并行,但c已并行

使用多个 .cpp 文件替代 C++ 中的条件编译

C ++模板头文件cpp分离,将* .cpp包含到* .h中的解决方案不再起作用

Arduino的IDE不承认.c文件是的.cpp

包括.cpp文件和.h文件(在cpp中具有相同内容)的区别?

将头文件与C和C ++关联

为什么C ++头文件不需要包含实现文件(.cpp)?

在C ++中的头文件中,单独的.cpp文件中编写的类的成员函数的定义

为什么C ++ Windows Store应用程序头文件对cpp文件中的包含感到满意?

Visual Studio,包括其他CPP中的CPP文件-现有项目中的问题

从 .c 文件调用 .cpp 文件中的函数

在测试项目中包括.cpp文件的更好方法?

.cpp文件中可以包含(不包括)什么?

你能用带有 .h 扩展名的 clang-cl 编译 C++ 头文件吗?

C++ 对类的未定义引用(1 个头文件 2 个 cpp)

设计.h和.cpp文件C ++:错误

在macOS上使用clang ++在Visual Studio Code中编译多个.cpp文件

从cpp文件创建动态库,并使用clang创建静态库