这似乎是一个简单的问题,但我看了一遍,找不到解决方案。
所以我有2个.cpp文件:一个主文件,以及一个主文件需要看到的函数库。由于各种原因,我不希望为函数库创建头文件。但是,我有一个头文件,其中包含两个.cpp文件需要查看的常量变量。
我明显不正确的理解是,我将这三个文件链接在一起的方式是让两个cpp文件“包含”头文件。但是,当我这样做时,main无法访问库中的函数。如果我向main添加一个额外的“包含库”行,我会得到“错误LNK2005”。如果我尝试使用主要“包含”库,并让库“包含”标题我也会得到“错误LNK2005”。
那么......我怎样才能使这个设置工作?
答案 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
会发生什么。我们也不知道我们是否提供了正确的类型作为参数 - 甚至是正确的数量!