Linker Error
-
Hallo Leute,
ich habe eine echt verzwickte Linkerfrage (wer mir da weiterhelfen kann: Respekt!). Also, ich habe eine Solution (VS 2008) mit 2 Projekten: Eine native statische C++ Lib und eine managed C++/CLI WinForms Anwendung (/cli). Die Managed Anwendung benutzt die C++ Lib. Läuft auch alles wunderbar.
Jetzt kommt das seltsame: Wenn ich der nativen C++ Lib 2 Dateien hinzufüge (Add existing files), nämlich "QuadTree.h" und "QuadTree.cpp" und jetzt beides neu "build" und ausführe, bekomme ich eine Assertion:Debug Assertion Failed!
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line 1511
Expression: _CrtIsValidHeapPointer(pUserData)Das verrückte an der Sache: Ich füge wirklich nur die 2 Dateien dem Projekt hinzu. Ich benutze sie NIRGENDS!
Der Callstack zum Zeitpunkt der Assertion sieht so aus:> msvcr90d.dll!_msize_dbg(void * pUserData=0xfb4fb79a, int nBlockUse=2) Line 1511 + 0x30 bytes C++
msvcr90d.dll!_dllonexit_nolock(int (void)* func=0xc3386abe, void (void)* * * pbegin=0x0017ede8, void (void)* * * pend=0x0017ede0) Line 295 + 0xd bytes C
msvcr90d.dll!__dllonexit(int (void)* func=0xc3386abe, void (void)* * * pbegin=0x0017ede8, void (void)* * * pend=0x0017ede0) Line 273 + 0x11 bytes C
herbstEdd.exe!_onexit(int (void)* func=0x00435630) Line 110 + 0x1b bytes C
herbstEdd.exe!atexit(void (void)* func=0x00435630) Line 127 + 0x9 bytes C
herbstEdd.exe!`dynamic initializer for 'herbst::scene::Patch::visiblePatches''() Line 923 + 0x32 bytes C++
[External Code]
[Frames below may be incorrect and/or missing, no symbols loaded for mscorwks.dll]
kernel32.dll!766be68b()
kernel32.dll!76641641()
kernel32.dll!766be68b()
kernel32.dll!76641641()
mscoree.dll!7900b1b3()
kernel32.dll!766be4a5()
ntdll.dll!7792cfed()
ntdll.dll!7792d1ff()Was mir auffällt: Das erste Element aus meinem Code ist das hier: herbst::scene::Patch::visiblePatches. Das ist eine statische Variable, die in Quadtree.h deklariert und Quadtree.cpp definiert wird (also in genau den 2 Dateien, die die Assertion auslösen, wenn ich sie dem Projekt hinzufüge). Die Variable sieht so aus:
// Quadtree.h class Patch { ... static std::vector<Patch*> visiblePatches; }; // Quadtree.cpp std::vector<Patch*> Patch::visiblePatches;
Ich habe nach dem Problem gegoogelt und auf einer Seite wurde geschrieben, man solle in den Projekteinstellungen bei Linker -> Input -> Force Symbol References das eingeben: __DllMainCRTStartup@12
Das kranke ist: das funktioniert tatsächlich! Wenn ich das in die Projekteinstellungen eintrage, dann funktioniert alles und ich kriege nicht mehr die Assertion! Nur würde ich jetzt gerne wissen WIESO das funktioniert.
Meine Fragen:1. Wieso entsteht überhaupt diese Assertion? Ich versteh das einfach nicht, wie ich eine Assertion kriegen kann, nur weil ich 2 Dateien dem Projekt hinzufüge, obwohl ich den Code darin nirgends verwende.
2. Was bedeutet das, dass ich __DllMainCRTStartup@12 bei Force Symbol References hinzugefügt habe? Was bewirkt das?
Danke für jede Hilfe!
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.