2017-03-29 5 views
0

Ich bin neu in C++. Ich versuche, einen sehr komplexen Video-Codec-Code als Teil meines Schulprojekts im letzten Jahr zu modifizieren. Ich habe es bereits in einem anderen Thread gefragt, aber keine Hilfe bekommen. Dies ist mein Code:Verwirrt, Warum C++ globale Variable in diesem Bereich nicht deklariert wurde

Dies ist die Header-Datei, in der ich drei externe Variablen deklariert haben:

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 

}; 
} 

Dies ist die erste Datei, die diese externen Variablen verwendet:

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 

Dies ist die zweite Klasse ist, wo ich bin mit th ese extern Variablen:

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 

Dies ist der Fehler, den ich, dass ich immer macht mich wirklich verwirrt:

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

Der Namespace im Quelltext 'X265_NS' unterscheidet sich von dem in den Fehlernachrichten' x265'. Gibt es hier ein Makro? Ist das Makro überall gleich definiert? –

+0

Es werden keine Makros verwendet. Wenn ich mit der Maus auf frameNumber in der Datei yuv.h schwebe, erscheint der angezeigte Tooltipp "int x265 :: frameNumber", der fälschlicherweise angezeigt wird, obwohl der angegebene Namensraum X265_NS lautet. Plus gibt es eine weitere Kommentar Erwähnung im Code ist "// private x265 Namespace" unter der öffnenden Klammer von X265_NS. –

+0

Ein Teil Ihres Problems besteht darin, dass Sie den Quellcode kompilieren und dann mit einer Bibliothek verknüpfen, die bereits den gleichen Quellcode enthält. Allerdings bin ich verwirrt, warum der Build-Prozess sogar den Linker lief, wenn es einen Kompilierungsfehler gab. –

Antwort

3

Sie könnten eine falsche Datei werden, einschließlich. Höchstwahrscheinlich gibt es noch eine weitere yuv.h Datei in einem Bibliotheks-Quellcode, die in analysis.cpp statt der benötigten Datei enthalten ist. Sie können dies schnell überprüfen, indem Sie einen fehlerhaften Code in Ihre yuv.h eingeben und versuchen, analysis.cpp zu kompilieren.

+0

Ich habe es gerade nicht bemerkt, aber Sie hatten Recht, es war einschließlich einer anderen yuv.h Datei. –

0

überprüfen analysis.cpp zu sehen, wenn Sie nicht tun definieren

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

wieder.

oder

Vielleicht haben Sie eine falsche Initialisierung wie:

int frameSize = 0; 

statt:

frameSize = 0; 
+0

Beide Dinge sind wie erforderlich geschrieben :( –

Verwandte Themen