链接共享.h文件的2个cpp文件

时间:2014-09-04 18:21:51

标签: c++ file header-files using

这似乎是一个简单的问题,但我看了一遍,找不到解决方案。

所以我有2个.cpp文件:一个主文件,以及一个主文件需要看到的函数库。由于各种原因,我不希望为函数库创建头文件。但是,我有一个头文件,其中包含两个.cpp文件需要查看的常量变量。

我明显不正确的理解是,我将这三个文件链接在一起的方式是让两个cpp文件“包含”头文件。但是,当我这样做时,main无法访问库中的函数。如果我向main添加一个额外的“包含库”行,我会得到“错误LNK2005”。如果我尝试使用主要“包含”库,并让库“包含”标题我也会得到“错误LNK2005”。

那么......我怎样才能使这个设置工作?

2 个答案:

答案 0 :(得分:1)

LNK2005 error表示多次定义符号。

这可能与您的"头文件有关,该文件包含几个常量变量" ,它们会破坏一个定义规则

例如,如果您的标题中有以下定义:

int MYCONST = 20;     // variable

它将在两个已编译的cpp文件中定义。将这些链接在一起时,链接器会注意到同一对象有两个定义。

你必须通过在标题中声明变量来解决这个问题(不定义它):

extern int MYCONST;   // declaration only.  Definition somewhere else

并仅在其中一个文件中定义它(例如在函数库中)。

或者更好,在标题中定义为一个真正的常量:

const int MYCONST =20;   // constant (does not offend odr rule)

一个定义规则也适用于函数定义(包括将在头文件中的类定义中定义的成员函数)。

答案 1 :(得分:0)

该标题需要声明您的'函数库中定义的函数'以便main.cpp查看和使用它们。

两个文件仅仅共享一些常见的包含是不够的。

通常情况下,这可能是这样的:

main.cpp中:

#include "functions.h"

int main(){
    int a = 2;
    char b = myFunction(a);

    return 0;
}

functions.cpp:

#include "functions.h"

char myFunction(int num){
    return 'a'+num;
}

functions.h:

char myFunction(int);

否则,在编译main.cpp时,无法检查b的类型是否正确 - 我们无法知道myFunction会发生什么。我们也不知道我们是否提供了正确的类型作为参数 - 甚至是正确的数量!