2017-03-29 71 views
0

我是C++的新手。我正在尝试修改非常复杂的视频编解码器代码,作为我最后一年的学校项目的一部分。我已经在另一个线程上询问过它,但没有得到任何帮助。这是我的代码:困惑,为什么C++全局变量未在此范围内声明

这是我已经声明了三个变量的extern头文件:

yuv.h

#include <vector> 
namespace X265_NS 
{ 
extern int frameNumber; 
extern int frameSize; 
extern std::vector<int>numbers; 

class YUVInput : public InputFile, public Thread 
{ 
protected: 

// some more variables 

public: 

// more variables and function declarations 

}; 
} 

这是一个使用这些变量的extern的第一个文件:

yuv.cpp

#include "yuv.h" 
//more includes 
#include <vector> 

namespace X265_NS { 
    int frameNumber; 
    int frameSize; 
    std::vector<int>numbers; 
} 

using namespace X265_NS; 

// some stuff and function calls 
// here I use my extern variables in a function 

frameNumber = readCount.get(); 
frameSize = ceil((double)height/32) * ceil((double)width/32); 

//more stuff 

bool YUVInput::populateFrameQueue() 
{ 
    if(read<1) 
      { 
        ifstream file("/home/abu-bakr/bin/test.txt"); 
        int number; 
        while (file >> number) 
          numbers.push_back(number); 
      } 
} 

// more stuff 

这是我使用日第二类ESE的extern变量:

analysis.cpp

#include "yuv.h" 
#include <vector> 
.... 
using namespace X265_NS; 

// some stuff 

// its in a function and only place where I am using these variables 
int qp_ctu = numbers.at((ctu.m_cuAddr + 1) + (frameSize*(frameNumber - 1))); 

// more stuff 

这是我得到的是是让我真的很困惑的错误:

analysis.cpp 
1>C:\x265_2.2\x265_2.2\source\encoder\analysis.cpp(170): warning C4244: '=' : conversion from 'int' to 'int8_t', possible loss of data 
1>C:\x265_2.2\x265_2.2\source\encoder\analysis.cpp(2814): error C2065: 'numbers' : undeclared identifier 
1>C:\x265_2.2\x265_2.2\source\encoder\analysis.cpp(2814): error C2228: left of '.at' must have class/struct/union 
1>   type is ''unknown-type'' 
1>C:\x265_2.2\x265_2.2\source\encoder\analysis.cpp(2814): error C2065: 'frameSize' : undeclared identifier 
1>C:\x265_2.2\x265_2.2\source\encoder\analysis.cpp(2814): error C2065: 'frameNumber' : undeclared identifier 

yuv.cpp 
2>C:\x265_2.2\x265_2.2\source\input\yuv.cpp(219): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data 
2>x265-static.lib(analysis.obj) : error LNK2005: "int x265::frameNumber" ([email protected]@@3HA) already defined in yuv.cpp.obj 
2>x265-static.lib(analysis.obj) : error LNK2005: "int x265::frameSize" ([email protected]@@3HA) already defined in yuv.cpp.obj 
2>  Creating library C:/x265_2.2/x265_2.2/build/vc10-x86/Debug/x265.lib and object C:/x265_2.2/x265_2.2/build/vc10-x86/Debug/x265.exp 
2>C:\x265_2.2\x265_2.2\build\vc10-x86\Debug\x265.exe : fatal error LNK1169: one or more multiply defined symbols found 
+0

源代码'X265_NS'中的名称空间与错误消息“x265”中的名称空间不同。这里有宏吗?这个宏定义到处都是一样的吗? –

+0

没有使用宏。事实上,当我将鼠标悬停在yuv.h文件的frameNumber上时,出现的工具提示显示与出现错误时相同的“int x265 :: frameNumber”,尽管提到的名称空间是X265_NS。 另外在代码中还有另外一个评论是在X265_NS的开头括号下的“// private x265 namespace”。 –

+0

问题的一部分是编译源代码,然后链接到已包含相同源代码的库。然而,我很困惑为什么构建过程甚至在出现编译错误时运行链接器。 –

回答

3

你可能会包括一个错误的文件。很可能在某些库源代码中有另一个yuv.h文件,它将被包含在analysis.cpp中,而不是您需要的文件。您可以通过在yuv.h中添加一些错误代码并尝试编译analysis.cpp来快速检查此问题。

+0

我只是没有注意到它,但你是对的,它包括另一个yuv.h文件。 –

0

检查analysis.cpp看,如果你不定义

namespace X265_NS { 
    int frameNumber; 
    int frameSize; 
    std::vector<int>numbers; 
} 

再次。

也许你有一个错误的初始化,如:

int frameSize = 0; 

代替:

frameSize = 0; 
+0

这两个东西都是根据需要写的:( –