C ++如何在两个不同项目中的静态变量之间进行链接

时间:2010-12-14 11:42:24

标签: c++ linux

我是C ++ linux的新手,我对这是如何工作有疑问,

header.h

static int arr [2] [2] = {some values}

lib.cpp - 包含header.h文件并创建.so

source.cpp - 包含相同的header.h文件(和dynamicaly链接lib.so)并在链接时抛出.gnu.linkonce_t错误

所以,为了避免这种情况,我采用了这种方法,

header.h

class x {

static int arr [2] [2];
}

lib.cpp - 包含header.h文件并创建.so

source.cpp -

int x::arr = {define some values}

包含相同的header.h文件,并且不会抛出链接错误

2 个答案:

答案 0 :(得分:1)

像你这样的接缝不知道在标题中声明静态变量会发生什么。

详细了解here

将静态数组放在类中的解决方案很好,但在某些情况下可能导致静态顺序初始化失败,因此在使用静态类成员变量时必须小心。

如果您更喜欢第一种方式,可以将数组声明为extern变量,并在源文件中定义它。

答案 1 :(得分:1)

首先,您不应该在头文件中定义静态全局变量。在类外部定义变量static与在类中定义静态具有完全不同的含义。这非常令人困惑,但它是C ++的工作方式。

C ++中关键字static至少有四种用法:

1)类外部的静态全局变量只对全局代码可以直接“看到”变量,因为它们位于同一个文件中。这使得变量本地变量。如上所述,您不应将其中一个放入标题中。如果这样,您将获得同一变量的多个实例。每个文件中包含一个标题。对一个的更改不会影响其他文件中的其他文件。

2)静态全局函数与#1中的静态全局变量具有很多相同的含义。一般来说,这意味着只能从声明它的文件中调用该函数。与静态全局变量一样,如果在头文件中实现静态全局函数,最终将在最终可执行文件中使用它的多个副本。但是,与静态全局变量不同,如果在头文件中放置静态全局函数 definition ,则无法链接生成的目标文件。

3)类中的静态变量意味着该类的所有实例只有该变量的一个副本。

4)类中的静态成员函数只能访问该类中的静态变量。静态成员函数无法访问所有其他类数据。但是,您可以在没有类实例的情况下调用静态成员函数。例如A::func()

您可能想要的是使用静态类变量或将extern定义放在头文件中,如下所示:

extern int arr[2][2];

然后在实现文件中的一些实际创建变量实例的地方,作为非静态变量,如下所示:

int arr[2][2] = {some values};

确保您了解声明/定义与实例化/实现之间的区别。这些是用C / C ++保存概念。