2013-06-27 5 views
2

Я работаю над небольшим куском большого проекта. Первоначально проект был написан на 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, что было явно проблематично.

+2

[OT] Это замечание выше магического числа говорят это не волшебное число было действительно смешно! – yzt

+0

Я думаю, что было бы лучше фактически поместить объявление класса вокруг вышеуказанного кода (поскольку сам код не показывает, что все это внутри класса.) Ничего особенного, просто строки 'class' и' public' и фигурные скобки было бы достаточно. – yzt

ответ

1

Я думаю, ваша проблема мощь быть, что вы забываете на самом деле определить static пользователей в файле CPP, например, так: (в Extent.cpp)

Extent::structThing Extent::structArray [Extent::num_things]; 
Extent::structArray_init Extent::thingy_init; 
+1

Вы точно верны. Мы закончили переход на просто инициализацию членов в «Extent.cpp», и это, по крайней мере, работает. – DYS