多重定义[..]首先在此处定义
Multiple definition [...] first define here
本文关键字:定义 更新时间:2023-10-16
我正在编写一个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.仅与定义
宏块表.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).Im在.h中包括macroblocktable.h和macroblocktype.h,在h.264.cpp中仅包括h.264.h
我想使用h.264.cpp中macroblocktable.cpp的函数。
提前感谢
您必须在.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];
你应该很好
它不仅仅是"定义"。您在其中声明变量,因此每次包含这些变量时,您都在重新声明全局变量。
如果您想要从其他.c/.cpp文件访问I_Macroblock_Modes
,则应在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
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类