我正在使用Boost 1.44.0来交叉编译Python的C ++代码。我试图暴露一个在ExposureSinusoid.h中定义的静态常量,如下所示:
static const UINT _min_exp = 20;
根据Boost团队的文档,在extend.cpp文件中,我试图像这样公开它们:
.def_readonly("_min_exp", &ExposureSinusoid::_min_exp)
库编译得很好但是程序运行时出现以下错误:
ImportError: ../linux/appfs/master/usr/lib/python2.6/pa/vision/_vision.so: undefined symbol: _ZN16ExposureSinusoid8_min_expE
为了排除Boost没有找到常量的可能性,我尝试在extend.cpp中更改其名称,并且库无法编译。所以在编译期间似乎找到了常量,但它没有被正确暴露。
答案 0 :(得分:4)
除了声明之外,static
数据成员还必须定义。
// ExposureSinusoid.h
class ExposureSinusoid
{
// ...
public:
static const UINT _min_exp = 20; // declaration
// ...
};
// ExposureSinusoid.cpp
const UINT ExposureSinusoid::_min_exp; // definition
唯一可以省略static
数据成员定义的情况是当有问题的数据成员是const
基本积分类型时,和它被初始化使用常量表达式和它永远不会使用ODR(参见C ++ 03标准,§9.4.2/ 4);但是,获取变量的地址有资格作为ODR使用,因此在您的情况下必须提供定义。
答案 1 :(得分:3)
静态链接意味着符号在TU外部不可见!将static
更改为extern
(因为全局常量是隐式静态的):
extern const UINT _min_exp = 20;
更正:我没有看到_min_exp
是成员变量,道歉。在这种情况下,正如ildjarn已经说过的那样,答案是在类定义之外添加变量的定义。可以肯定的是,声明和初始化都在里面,但定义在外面:
struct Foo {
static const int a = 1; // initialization can go inside the class definition
};
const int Foo::a; // definition (this is what the linker sees)