2010-12-20 8 views
0

Ich kompilierte eine Exe auf Windows VS 2005, ein C++ - Programm, das mit anderen Bibliotheken von mir verlinkt. Es kompiliert und es tut plötzlich nicht mehr mit einem Fehler von LNK1170 COMDAT "Windows Fehler LNK1179

Ich kann nicht verstehen, was passiert ist und wie das Problem zu lösen.

Dank

+0

Poorly formuliert. – karlphillip

Antwort

0

Wie dem auch sei, überprüfen Sie die offizielle Dokumentation über es:

http://msdn.microsoft.com/en-us/library/cddbs9aw%28VS.80%29.aspx

http://msdn.microsoft.com/en-us/library/aa234469%28VS.60%29.aspx

Und wenn Sie codeguru überprüfen, fand ein Mann und eine andere Art und Weise ein Problem ähnlich wie bei Ihnen zu lösen:

Ausbau-> Einstellungen-> C++ Registerkarte Debug Kathegorie: Inline-Funktionserweiterung: Wechsel von ‚None‘ zu ‚Nur _in der Reihe'.

+0

Verwenden Sie VS 2005? –

+0

@Roman Ich konnte das beschriebene Verhalten nicht reproduzieren. Dies sind einige der Ergebnisse, die ich vom Googeln erhalten habe! – karlphillip

1

Dies wird von http://msdn.microsoft.com/en-us/library/aa234469(VS.60).aspx kopiert


Linkers Werkzeuge Fehler LNK1179

Visual Studio 6.0

ungültige oder beschädigte Datei: Duplikat COMDAT COMDAT

Ein Objektmodul enthielt zwei oder mo re COMDATs mit dem gleichen Namen.

Eine mögliche Ursache ist, wenn Sie die Option/H mit/Gy verwenden. Die Option/H begrenzt die Länge externer Namen und die Optionspakete von/Gy funktionieren in COMDATs.

Zum Beispiel, wenn Sie das folgende mit/Gy und/H8 kompilieren, werden Sie Fehler LNK1179 erhalten, da das Objektmodul zwei COMDATs mit dem gleichen Namen enthalten (function1 und function2 einzigartig ist auf neun Zeichen):

void function1(void); 
void function2(void); 

void main(void) { 
    function1(); 
    function2(); 
} 

void function1(void) {} 
void function2(void) {} 
+0

Ja das habe ich gesehen, danke, ich habe sowohl den Befehl von comiple als auch link überprüft und ich habe die Flags nicht, ich habe die IDE neu gestartet und neustartet. Ich habe es geschafft, es zu lösen, nachdem ich clean und comiple wieder (nicht neu kompilieren Option) 2 libs von mir. Ich verstehe nicht, warum es geholfen hat. –

+1

Die schlimmsten Bugs, die es gibt, sind diejenigen, die sich selbst reparieren. Sie kommen immer wieder! – pcantin

0

Ich habe wieder die IDE gestartet und auch die Maschine neu gestartet und es hat nicht geholfen. Ich habe es geschafft, es zu lösen, nachdem ich clean und comiple wieder (nicht neu kompilieren Option) 2 libs von mir. Ich verstehe nicht, warum es geholfen hat, aber es ist gelungen, das Projekt zu likken.

2

Es gibt viele Fragen, um diesen Fehler in Bezug auf zB:

  • ungenannter Sachen mit (struct, Klasse, Namespace)
  • Instanziierung Template-Parameter
  • inkrementelle Verknüpfung
  • ...

Ich habe den Fehler in dieser Situation erlebt:

template < class InputIterator > 
Id findOrInsertSomething(const std::string & name, InputIterator begin, InputIterator end) 
{ 
    Id out; 
    { 
     static std::string sql(calculateQueryA()); 
     if (findSomething(sql, name, out)) 
      return out; 
    } 

    static std::string sql(calculateQueryB()); 
    out = insertSomehing(sql, name, begin, end); 
    return out; 
} 

Bei Verwendung im Code ist der Verbindungsfehler LNK1179 aufgetreten. Das Problem ist einfach. Auch ohne/H-Schalter kann die maximale Länge der Namen 2047 Zeichen betragen.Wenn Vorlagenvorlagen verwendet werden, werden normalerweise sehr lange Namen erstellt. Im Beispiel gibt es 2 statische Variablen mit dem gleichen Namen. Sie werden wie folgt benannt:

sql?something-like-function-signature?something-like-block-signature 

was kann leicht länger als 2047 Zeichen sein. Weil something-like-block-signature am Ende ist, wird es hinter der Grenze von 2047 liegen, was effektiv sowohl sql Variablen für den Linker gleich macht.

Lösung ist einfach:

  • verschiedenen Namen
  • ausblenden Optimierung in Funktion (nicht für jede Version der Vorlage berechnet werden)
0

dieses Problem Erfahrene, während eine Bindung machen zu eine Mitgliedsfunktion:

std::function<void(Appender<Contact>&)> f = std::bind(&Manager::AppendContacts, this, std::placeholders::_1); 

Und dann passiert es som ewhere:

gBuf.append(f); 

Der Fehler war:

LNK1179: invalid or corrupt file: duplicate COMDAT (...) 

Die Member-Funktion genau die gleiche Signatur wie f zu haben scheint (oder vielleicht überschreitet die maximale Grenze der Linker Prüfungen)

Wenn ich Anstatt es inline zu schreiben, ohne das Zwischenprodukt f, gibt es keinen Fehler.

gBuf.append(std::bind(&Manager::AppendContacts, this, std::placeholders::_1)); 

Ich gebe vor, nicht zu verstehen, was hier passiert, aber vielleicht kann ich jemand ein paar Stunden speichern dies herauszufinden, wie ich hatte ...