用嘘声暴露静态常数

2024-10-01 13:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Boosiv1.44.0来交叉编译Python的C++代码。我尝试公开exposuresinosoid.h中定义的静态常量,如下所示:

static const UINT _min_exp = 20;

在档案里扩展.cpp,根据Boost团队的文档,我正试图这样揭露它们:

^{pr2}$

这个库编译得很好,但是当程序运行时,我得到以下错误:

ImportError: ../linux/appfs/master/usr/lib/python2.6/pa/vision/_vision.so: undefined symbol: _ZN16ExposureSinusoid8_min_expE

为了排除Boost没有找到常数的可能性,我尝试在扩展.cpp但库无法编译。因此,似乎在编译过程中找到了常量,但它没有被正确地公开。在


Tags: 代码定义静态static档案min团队cpp
2条回答

静态链接意味着符号在TU之外是可见的!将static更改为extern(因为全局常量隐式静态):

extern const UINT _min_exp = 20;

更正:我没有看到_min_exp是一个成员变量,抱歉。在这种情况下,答案是,正如ildjarn已经说过的,在类定义之外添加变量的定义。可以肯定的是,声明和初始化都在内部,但定义在外部:

^{pr2}$

除了声明之外,static数据成员还必须是定义的。在

// ExposureSinusoid.h
class ExposureSinusoid
{
    // ...
public:
    static const UINT _min_exp = 20;   // declaration
    // ...
};

// ExposureSinusoid.cpp
const UINT ExposureSinusoid::_min_exp; // definition

唯一可以省略^ {< CD1>}数据成员定义的情形是当所讨论的数据成员是^ {< CD3>}基本积分类型时,用常数表达式初始化,它从未使用ODR(参见C++ 03标准,〈〈94.2/4)〉;获取变量的地址限定为ODR用法,因此在您的情况下必须提供定义。在

相关问题 更多 >