Я работаю над небольшим куском большого проекта. Первоначально проект был написан на C и был переделан на C++ около 6 лет назад (я впервые услышал о проекте около 3 недель назад ...)Ошибка компоновщика с массивом структур в заголовке
Все компилируется просто отлично. Ошибка у меня от линкера:
libBlah.so.0.0: undefined reference to `Extent::structArray'
collect2: error: ld returned 1 exit status
ошибка возникает с каким исполняемым файлом он пытается связать первый; существует несколько исполняемых файлов, каждый из которых зависит от класса Extent
и элемента данных structArray
. Прежде чем пытаться (и не удается) связать другие исполняемые файлы, он успешно связывает всю библиотеку libBlah
.
В Extent.hpp
, в public
разделе декларации Extent
класса, structArray
объявляется (и hackily инициализирован), таким образом:
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
, что было явно проблематично.
[OT] Это замечание выше магического числа говорят это не волшебное число было действительно смешно! – yzt
Я думаю, что было бы лучше фактически поместить объявление класса вокруг вышеуказанного кода (поскольку сам код не показывает, что все это внутри класса.) Ничего особенного, просто строки 'class' и' public' и фигурные скобки было бы достаточно. – yzt