我正在做一个大项目的一小部分。该项目最初是用 C 编写的,大约在 6 年前过渡到了 C++(我第一次听说这个项目是在大约 3 周前......)
一切都编译得很好。我遇到的错误来自链接器:
libBlah.so.0.0: undefined reference to `Extent::structArray'
collect2: error: ld returned 1 exit status
该错误发生在它首先尝试链接的任何可执行文件中;有一些可执行文件,每个都取决于Extent
类和structArray
数据成员。在尝试(和失败)链接其他可执行文件之前,它成功链接了整个libBlah
库。
In Extent.hpp
,在类声明的public
部分,被声明(并被hackily初始化),因此:Extent
structArray
struct structThing
{
const char *name;
int compress_flag;
bool (*func1)( byte*, int32, ByteArray&, int );
bool (*func2)( byte*, byte*, int32, int32& );
};
// This isn't actually a magic number
static const int num_things = 7;
static structThing structArray[ num_things ];
struct structArray_init
{
structArray_init()
{
structThing init[] =
{
{ "none", 0, NULL, NULL },
{ "thingA", 1, funca1, funca2 },
{ "thingB", 2, funcb1, funcb2 },
{ "thingC", 4, funcc1, funcc2 },
{ "thingD", 8, funcd1, funcd2 },
{ "thingE", 16, funce1, funce2 },
{ "thingF", 32, funcf1, funcf2 }
};
for( int i = 0 ; i < num_things ; ++i )
{
structArray[i] = init[i];
}
}
};
static structArray_init thingy_init;
所有 12 个函数(funca1 到 funcf2)都是 的静态函数Extent
,稍后在标头的公共部分中声明。
构建由 CMake 管理。基本上,在 CMake 中,每个独立的依赖程序都被赋予了整个libBlah
库作为依赖项。我尝试过使用链接顺序,但无济于事。
在此链接器错误之前,我遇到了由于structArray
在 的非静态函数中初始化而导致的编译错误Extent
,这显然是有问题的。