Множественное определение [...] сначала определите здесь

Я пишу парсер H264 (без OO), но я пытаюсь использовать некоторые модули, чтобы лучше организовать вещи.

У меня возникли следующие проблемы:

`CMakeFiles/server.dir/mainclass.cpp.o:(.bss+0x0): multiple definition of `I_Macroblock_Modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x0): first defined here  
`CMakeFiles/server.dir/mainclass.cpp.o:(.bss+0x300): multiple definition of `P_and_SP_macroblock_modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x300): first defined here  
`CMakeFiles/server.dir/mainclass.cpp.o:(.bss+0x680): multiple definition of `B_Macroblock_Modes' 
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x680): first defined here  
`CMakeFiles/server.dir/thRunAppl.cpp.o:(.bss+0x0): multiple definition of `I_Macroblock_Modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x0): first defined here  
`CMakeFiles/server.dir/thRunAppl.cpp.o:(.bss+0x300): multiple definition of `P_and_SP_macroblock_modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x300): first defined here  
`CMakeFiles/server.dir/thRunAppl.cpp.o:(.bss+0x680): multiple definition of `B_Macroblock_Modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x680): first defined here  
`CMakeFiles/server.dir/h.264parser.cpp.o:(.bss+0x0): multiple definition of `I_Macroblock_Modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x0): first defined here  
`CMakeFiles/server.dir/h.264parser.cpp.o:(.bss+0x300): multiple definition of `P_and_SP_macroblock_modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x300): first defined here  
`CMakeFiles/server.dir/h.264parser.cpp.o:(.bss+0x680): multiple definition of `B_Macroblock_Modes'  
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x680): first defined here  
`CMakeFiles/server.dir/moc_mainclass.cxx.o:(.bss+0x0): multiple definition of `I_Macroblock_Modes'
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x0): first defined here
`CMakeFiles/server.dir/moc_mainclass.cxx.o:(.bss+0x300): multiple definition of `P_and_SP_macroblock_modes'
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x300): first defined here
`CMakeFiles/server.dir/moc_mainclass.cxx.o:(.bss+0x680): multiple definition of `B_Macroblock_Modes'
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x680): first defined here
`CMakeFiles/server.dir/moc_thRunAppl.cxx.o:(.bss+0x0): multiple definition of `I_Macroblock_Modes'
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x0): first defined here
`CMakeFiles/server.dir/moc_thRunAppl.cxx.o:(.bss+0x300): multiple definition of `P_and_SP_macroblock_modes'
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x300): first defined here
`CMakeFiles/server.dir/moc_thRunAppl.cxx.o:(.bss+0x680): multiple definition of `B_Macroblock_Modes'
`CMakeFiles/server.dir/main.cpp.o:(.bss+0x680): first defined here
`CMakeFiles/server.dir/h.264parser.cpp.o: In function `MbPartPredMode(int, int)':  
`h.264parser.cpp:(.text+0xf0): undefined reference to `B_macroblockmodes(int, int)'  
`h.264parser.cpp:(.text+0x104): undefined reference to `B_macroblockmodes(int, int)'  
`h.264parser.cpp:(.text+0x111): undefined reference to `I_macroblockmodes(int, int)'  
`h.264parser.cpp:(.text+0x124): undefined reference to `P_and_SP_macroblockmodes(int, int)'  
`h.264parser.cpp:(.text+0x134): undefined reference to `P_and_SP_macroblockmodes(int, int)' 

Мой сценарий:

macroblocktypes.h. только с определениями

macroblocktables.h:

#include "macroblocktypes.h"

int I_Macroblock_Modes[27][7];
int P_and_SP_macroblock_modes[32][7];
int B_Macroblock_Modes[50][7];

int I_macroblockmodes(int line, int column);
int P_and_SP_macroblockmodes(int line, int column);
int B_macroblockmodes(int line, int column);

macroblocktables.cpp, с массивом и функцией, определенной так для каждого массива и функции в файле.h.

#include "macroblocktables.h"
int I_macroblock_modes[27][7] ={
{0, I_4x4, 0, Intra_4x4, NA, NA, NA},
//If this line was to be commented out, the MbPartPredMode macro would have to be changed
//since it relies on the linear rise of the value in the first column.
//{0,   I_NxN,          1,  Intra_8x8,   NA, NA, NA},
{1, I_16x16_0_0_0, NA, Intra_16x16, 0, 0, 0},
{2, I_16x16_1_0_0, NA, Intra_16x16, 1, 0, 0},
{3, I_16x16_2_0_0, NA, Intra_16x16, 2, 0, 0},
{4, I_16x16_3_0_0, NA, Intra_16x16, 3, 0, 0},
{5, I_16x16_0_1_0, NA, Intra_16x16, 0, 1, 0},
{6, I_16x16_1_1_0, NA, Intra_16x16, 1, 1, 0},
{7, I_16x16_2_1_0, NA, Intra_16x16, 2, 1, 0},
{8, I_16x16_3_1_0, NA, Intra_16x16, 3, 1, 0},
{9, I_16x16_0_2_0, NA, Intra_16x16, 0, 2, 0},
{10, I_16x16_1_2_0, NA, Intra_16x16, 1, 2, 0},
{11, I_16x16_2_2_0, NA, Intra_16x16, 2, 2, 0},
{12, I_16x16_3_2_0, NA, Intra_16x16, 3, 2, 0},
{13, I_16x16_0_0_1, NA, Intra_16x16, 0, 0, 15},
{14, I_16x16_1_0_1, NA, Intra_16x16, 1, 0, 15},
{15, I_16x16_2_0_1, NA, Intra_16x16, 2, 0, 15},
{16, I_16x16_3_0_1, NA, Intra_16x16, 3, 0, 15},
{17, I_16x16_0_1_1, NA, Intra_16x16, 0, 1, 15},
{18, I_16x16_1_1_1, NA, Intra_16x16, 1, 1, 15},
{19, I_16x16_2_1_1, NA, Intra_16x16, 2, 1, 15},
{20, I_16x16_3_1_1, NA, Intra_16x16, 3, 1, 15},
{21, I_16x16_0_2_1, NA, Intra_16x16, 0, 2, 15},
{22, I_16x16_1_2_1, NA, Intra_16x16, 1, 2, 15},
{23, I_16x16_2_2_1, NA, Intra_16x16, 2, 2, 15},
{24, I_16x16_3_2_1, NA, Intra_16x16, 3, 2, 15},
{25, I_PCM, NA, NA, NA, NA, NA}};

int P_and_SP_macroblock_modes[32][7] = {
{0, P_L0_16x16, 1, Pred_L0, NA, 16, 16},
{1, P_L0_L0_16x8, 2, Pred_L0, Pred_L0, 16, 8},
{2, P_L0_L0_8x16, 2, Pred_L0, Pred_L0, 8, 16},
{3, P_8x8, 4, NA, NA, 8, 8},
{4, P_8x8ref0, 4, NA, NA, 8, 8},
{0, I_4x4, 0, Intra_4x4, NA, NA, NA},
{1, I_16x16_0_0_0, NA, Intra_16x16, 0, 0, 0},
{2, I_16x16_1_0_0, NA, Intra_16x16, 1, 0, 0},
{3, I_16x16_2_0_0, NA, Intra_16x16, 2, 0, 0},
{4, I_16x16_3_0_0, NA, Intra_16x16, 3, 0, 0},
{5, I_16x16_0_1_0, NA, Intra_16x16, 0, 1, 0},
{6, I_16x16_1_1_0, NA, Intra_16x16, 1, 1, 0},
{7, I_16x16_2_1_0, NA, Intra_16x16, 2, 1, 0},
{8, I_16x16_3_1_0, NA, Intra_16x16, 3, 1, 0},
{9, I_16x16_0_2_0, NA, Intra_16x16, 0, 2, 0},
{10, I_16x16_1_2_0, NA, Intra_16x16, 1, 2, 0},
{11, I_16x16_2_2_0, NA, Intra_16x16, 2, 2, 0},
{12, I_16x16_3_2_0, NA, Intra_16x16, 3, 2, 0},
{13, I_16x16_0_0_1, NA, Intra_16x16, 0, 0, 15},
{14, I_16x16_1_0_1, NA, Intra_16x16, 1, 0, 15},
{15, I_16x16_2_0_1, NA, Intra_16x16, 2, 0, 15},
{16, I_16x16_3_0_1, NA, Intra_16x16, 3, 0, 15},
{17, I_16x16_0_1_1, NA, Intra_16x16, 0, 1, 15},
{18, I_16x16_1_1_1, NA, Intra_16x16, 1, 1, 15},
{19, I_16x16_2_1_1, NA, Intra_16x16, 2, 1, 15},
{20, I_16x16_3_1_1, NA, Intra_16x16, 3, 1, 15},
{21, I_16x16_0_2_1, NA, Intra_16x16, 0, 2, 15},
{22, I_16x16_1_2_1, NA, Intra_16x16, 1, 2, 15},
{23, I_16x16_2_2_1, NA, Intra_16x16, 2, 2, 15},
{24, I_16x16_3_2_1, NA, Intra_16x16, 3, 2, 15},
{25, I_PCM, NA, NA, NA, NA, NA},
{NA, P_Skip, 1, Pred_L0, NA, 16, 16}};

int B_macroblock_modes[50][7] = {
{0, B_Direct_16x16, NA, Direct, NA, 8, 8},
{1, B_L0_16x16, 1, Pred_L0, NA, 16, 16},
{2, B_L1_16x16, 1, Pred_L1, NA, 16, 16},
{3, B_Bi_16x16, 1, BiPred, NA, 16, 16},
{4, B_L0_L0_16x8, 2, Pred_L0, Pred_L0, 16, 8},
{5, B_L0_L0_8x16, 2, Pred_L0, Pred_L0, 8, 16},
{6, B_L1_L1_16x8, 2, Pred_L1, Pred_L1, 16, 8},
{7, B_L1_L1_8x16, 2, Pred_L1, Pred_L1, 8, 16},
{8, B_L0_L1_16x8, 2, Pred_L0, Pred_L1, 16, 8},
{9, B_L0_L1_8x16, 2, Pred_L0, Pred_L1, 8, 16},
{10, B_L1_L0_16x8, 2, Pred_L1, Pred_L0, 16, 8},
{11, B_L1_L0_8x16, 2, Pred_L1, Pred_L0, 8, 16},
{12, B_L0_Bi_16x8, 2, Pred_L0, BiPred, 16, 8},
{13, B_L0_Bi_8x16, 2, Pred_L0, BiPred, 8, 16},
{14, B_L1_Bi_16x8, 2, Pred_L1, BiPred, 16, 8},
{15, B_L1_Bi_8x16, 2, Pred_L1, BiPred, 8, 16},
{16, B_Bi_L0_16x8, 2, BiPred, Pred_L0, 16, 8},
{17, B_Bi_L0_8x16, 2, BiPred, Pred_L0, 8, 16},
{18, B_Bi_L1_16x8, 2, BiPred, Pred_L1, 16, 8},
{19, B_Bi_L1_8x16, 2, BiPred, Pred_L1, 8, 16},
{20, B_Bi_Bi_16x8, 2, BiPred, BiPred, 16, 8},
{21, B_Bi_Bi_8x16, 2, BiPred, BiPred, 8, 16},
{22, B_8x8, 4, NA, NA, 8, 8},
{0, I_4x4, 0, Intra_4x4, NA, NA, NA},
{1, I_16x16_0_0_0, NA, Intra_16x16, 0, 0, 0},
{2, I_16x16_1_0_0, NA, Intra_16x16, 1, 0, 0},
{3, I_16x16_2_0_0, NA, Intra_16x16, 2, 0, 0},
{4, I_16x16_3_0_0, NA, Intra_16x16, 3, 0, 0},
{5, I_16x16_0_1_0, NA, Intra_16x16, 0, 1, 0},
{6, I_16x16_1_1_0, NA, Intra_16x16, 1, 1, 0},
{7, I_16x16_2_1_0, NA, Intra_16x16, 2, 1, 0},
{8, I_16x16_3_1_0, NA, Intra_16x16, 3, 1, 0},
{9, I_16x16_0_2_0, NA, Intra_16x16, 0, 2, 0},
{10, I_16x16_1_2_0, NA, Intra_16x16, 1, 2, 0},
{11, I_16x16_2_2_0, NA, Intra_16x16, 2, 2, 0},
{12, I_16x16_3_2_0, NA, Intra_16x16, 3, 2, 0},
{13, I_16x16_0_0_1, NA, Intra_16x16, 0, 0, 15},
{14, I_16x16_1_0_1, NA, Intra_16x16, 1, 0, 15},
{15, I_16x16_2_0_1, NA, Intra_16x16, 2, 0, 15},
{16, I_16x16_3_0_1, NA, Intra_16x16, 3, 0, 15},
{17, I_16x16_0_1_1, NA, Intra_16x16, 0, 1, 15},
{18, I_16x16_1_1_1, NA, Intra_16x16, 1, 1, 15},
{19, I_16x16_2_1_1, NA, Intra_16x16, 2, 1, 15},
{20, I_16x16_3_1_1, NA, Intra_16x16, 3, 1, 15},
{21, I_16x16_0_2_1, NA, Intra_16x16, 0, 2, 15},
{22, I_16x16_1_2_1, NA, Intra_16x16, 1, 2, 15},
{23, I_16x16_2_2_1, NA, Intra_16x16, 2, 2, 15},
{24, I_16x16_3_2_1, NA, Intra_16x16, 3, 2, 15},
{25, I_PCM, NA, NA, NA, NA, NA},
{NA, B_Skip, NA, Direct, NA, 8, 8}};

int I_macroblockmodes(int line, int column) {
if (line < 27 && column < 7)
    return I_macroblock_modes[line][column];
else {
    if (line >= 27) {
        return -10000; //line is bigger than the array size
    } else {
        return -20000; //column is bigger than the array size
    }
}}
//Inter prediction slices - Macroblock types
//Defined strictly by norm, page 121.

//(Table 7-13 Macroblock type values 0 to 4 for P and SP slices)
/*
First column:   mb_type
Second column:  Name of mb_type
Third column:   NumMbPart( mb_type )
Fourth column:  MbPartPredMode( mb_type, 0 )
Fifth column:   MbPartPredMode( mb_type, 1 )
Sixth column:   MbPartWidth( mb_type )
Seventh column: MbPartHeight( mb_type )
*/
int P_and_SP_macroblockmodes(int line, int column){
 if (line < 32 && column < 7)
    return P_and_SP_macroblock_modes[line][column];
else {
    if (line >= 32) {
        return -10000; //line is bigger than the array size
    } else {
        return -20000; //column is bigger than the array size
    }
}}



//p94. Table 7-14 – Macroblock type values 0 to 22 for B slices
/*
First column:   mb_type
Second column:  Name of mb_type
Third column:   NumMbPart( mb_type )
Fourth column:  MbPartPredMode( mb_type, 0 )
Fifth column:   MbPartPredMode( mb_type, 1 )
Sixth column:   MbPartWidth( mb_type )
Seventh column: MbPartHeight( mb_type )
 */
int B_macroblockmodes(int line, int column){
 if (line < 50 && column < 7)
    return B_macroblock_modes[line][column];
else {
    if (line >= 50) {
        return -10000; //line is bigger than the array size
    } else {
        return -20000; //column is bigger than the array size
    }
}}

И, наконец, мои файлы h.264 (.cpp и.h). Я включаю в.h macroblocktable.h и macroblocktype.h, а в h.264.cpp просто h.264.h.

Я хотел бы использовать функции из macroblocktable.cpp в h.264.cpp.

заранее спасибо

2 ответа

Решение

Вы должны хранить только объявления в файле.h, а не определения, чтобы не получить ошибок компоновщика. Эти

int I_Macroblock_Modes[27][7];
int P_and_SP_macroblock_modes[32][7];
int B_Macroblock_Modes[50][7];

это определения, а не интуитивные, как может показаться. Измените это на

extern int I_Macroblock_Modes[27][7];
extern int P_and_SP_macroblock_modes[32][7];
extern int B_Macroblock_Modes[50][7];

и ты должен быть в порядке

Это не "просто определяет". Вы объявляете переменные внутри него, поэтому каждый раз, когда это включается, вы переделываете глобальные переменные.

Если вы хотите получить доступ I_Macroblock_Modes из других файлов.c/.cpp, в заголовке macroblocktables.h вы должны поместить:

//resides in macroblocktables.cpp
extern int I_Macroblock_Modes[27][7];
extern int P_and_SP_macroblock_modes[32][7];
extern int B_Macroblock_Modes[50][7];

// the rest of it

Потому что эти массивы int определены в macroblocktables.cpp, верно?

В C/C++ каждый раз вы делаете что-то вроде:

int myarray[4];
char mychar;

или в более общем плане

type var_name;

вы говорите компилятору: пожалуйста, выделите для меня в стеке переменную с именем X это имеет тип T,

когда ты #include header.hВ самом простом объяснении вы говорите препроцессору: откройте header.h ctrl+c, и ctrl+v здесь. Затем этот предварительно обработанный исходный файл подается на ваш компилятор и каждый раз, когда он видит type var_name это будет делать то, что я объяснил выше.

Извините, если это слишком много информации, но я просто хотел написать:P

Другие вопросы по тегам