链接器错误取决于声明实例的位置
Linker error depending on where an instance is declared
我有以下头文件:
class LogisticActivationFunction
{
public:
double evaluate(double x) const;
double evaluate_derivative(double x) const;
};
LogisticActivationFunction logisticActivationFunction;
然后在 main.cpp 中我包含它(并且什么都不做)并且我得到一个 ld 错误。如果我删除声明 LogisticActivationFunction logisticActivationFunction
,我不会收到 ld 错误。
真正奇怪的是,如果我只添加另一个头文件:
#include "logistic_activation_function.h"
LogisticActivationFunction logisticActivationFunction;
并且包括它而不是它编译得很好,即使我通过头文件工作的方式应该完全等同于在另一个头文件中声明。
知道是什么原因造成的吗?
在 header 中定义命名空间范围变量不是一个好主意。如果 header 包含在多个翻译单元中(这是对 header 非常典型的事情),那么就会有多个定义,这违反了语言规则。
在header中,您可以使用extern
linkage-specifier声明一个变量而不用定义。然后,您可以只在一个源文件中定义变量。或者,自 C++17 起,您可以声明变量 inline
,在这种情况下,不需要在源文件中单独定义。
我有以下头文件:
class LogisticActivationFunction
{
public:
double evaluate(double x) const;
double evaluate_derivative(double x) const;
};
LogisticActivationFunction logisticActivationFunction;
然后在 main.cpp 中我包含它(并且什么都不做)并且我得到一个 ld 错误。如果我删除声明 LogisticActivationFunction logisticActivationFunction
,我不会收到 ld 错误。
真正奇怪的是,如果我只添加另一个头文件:
#include "logistic_activation_function.h"
LogisticActivationFunction logisticActivationFunction;
并且包括它而不是它编译得很好,即使我通过头文件工作的方式应该完全等同于在另一个头文件中声明。
知道是什么原因造成的吗?
在 header 中定义命名空间范围变量不是一个好主意。如果 header 包含在多个翻译单元中(这是对 header 非常典型的事情),那么就会有多个定义,这违反了语言规则。
在header中,您可以使用extern
linkage-specifier声明一个变量而不用定义。然后,您可以只在一个源文件中定义变量。或者,自 C++17 起,您可以声明变量 inline
,在这种情况下,不需要在源文件中单独定义。