Frage

Ich erhalte dies nicht-virtuellen thunk Fehler nur in dem Deployment-Build von meiner App. Es verwendet einen privaten Rahmen genannt Lgi. Aufbauend auf 10.5.8 mit XCode 3.1.4 (latest für Leopard?) Die Fehler sieht wie folgt aus:

Ld /Users/matthew/Code/Scribe-Branches/v2.00/build/Development/Scribe.app/Contents/MacOS/Scribe normal i386
    cd /Users/matthew/Code/Scribe-Branches/v2.00
    /Developer/usr/bin/g++-4.0 -arch i386 -L/Users/matthew/Code/Scribe-Branches/v2.00/build/Development -F/Users/matthew/Code/Scribe-Branches/v2.00/build/Development -F/Users/matthew/Code/Lgi/build -F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development -F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development -F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment -F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development -F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment -filelist /Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Development/Scribe.build/Objects-normal/i386/Scribe.LinkFileList -framework Carbon -framework Lgi -o /Users/matthew/Code/Scribe-Branches/v2.00/build/Development/Scribe.app/Contents/MacOS/Scribe
Undefined symbols:
  "non-virtual thunk to GWindow::OnDrop(char*, GVariant*, GdcPt2, int)", referenced from:
      vtable for ScribeWndin ScribeApp.o
      vtable for GShutdownin ScribeApp.o
      vtable for CalendarUiin Calendar.o
      vtable for CalendarViewWndin CalendarView.o
      vtable for CalendarConfigin CalendarView.o
      vtable for ScribeExportin Exp_Scribe.o
      vtable for GNewMailDlgin GNewMailDlg.o
      ....etc for lots of classes....

Auf jeden Fall weiß ich, dass ich nicht verlasse diejenigen nicht definiert, weil es in der Tat Link und gut laufen in der Entwicklung bauen. Jetzt, nachdem das Problem das erste, was zu versuchen googeln verändert die Optimierungseinstellung, was ich auch tat ... und keine Würfel. Einige Verbindungsfehler.

Also diese virtuelle Funktionen werden zunächst in GDragDropTarget definiert, und GWindow Erbe sieht wie folgt aus:

class LgiClass GWindow : public GView
#ifndef WIN32
    , public GDragDropTarget
#endif

(LgiClass für __declspec Export / Import auf win32 ist)

Irgendwelche Ideen auf, was als nächstes zu versuchen?

Btw ist dies einige Beispiel-Flaggen für Rahmen:

CompileC build/Lgi.build/Deployment/Lgi.build/Objects-normal/i386/GViewCommon.o 
/Users/matthew/Code/Lgi/src/common/Lgi/GViewCommon.cpp normal i386 c++ 
com.apple.compilers.gcc.4_0
cd /Users/matthew/Code/Lgi
/Developer/usr/bin/gcc-4.0 -x c++ -arch i386 -fmessage-length=0 -pipe -Wno-trigraphs 
-fpascal-strings -fasm-blocks -Os -Wreturn-type -Wunused-variable 
-isysroot /Developer/SDKs/MacOSX10.4u.sdk -fvisibility-inlines-hidden 
-mmacosx-version-min=10.4 
-I/Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/Lgi.hmap 
-F/Users/matthew/Code/Lgi/build/Deployment 
-F/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks -Iinclude/common 
-Iinclude/mac -Iinclude/posix -I/Users/matthew/Code/Lgi/build/Deployment/include 
-I/Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/DerivedSources/i386 
-I/Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/DerivedSources 
-DMAC 
-include /var/folders/b4/b4LnxwCQGLCmwy36TH3QuU+++TQ/-Caches-/com.apple.Xcode.503/SharedPrecompiledHeaders/Lgi_Prefix-aukthgaeovjxcucuoascfyqekpzz/Lgi_Prefix.pch -c /Users/matthew/Code/Lgi/src/common/Lgi/GViewCommon.cpp 
-o /Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/Objects-normal/i386/GViewCommon.o

Ld /Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/Objects-normal/i386/Lgi normal i386
cd /Users/matthew/Code/Lgi
setenv MACOSX_DEPLOYMENT_TARGET 10.4
/Developer/usr/bin/g++-4.0 -arch i386 -dynamiclib -isysroot /Developer/SDKs/MacOSX10.4u.sdk 
-L/Users/matthew/Code/Lgi/build/Deployment 
-F/Users/matthew/Code/Lgi/build/Deployment 
-F/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks 
-filelist /Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/Objects-normal/i386/Lgi.LinkFileList 
-install_name @executable_path/../Frameworks/Lgi.framework/Versions/A/Lgi 
-mmacosx-version-min=10.4 -framework Carbon 
-framework SystemConfiguration -Wl,-single_module -compatibility_version 1 
-current_version 1 -o /Users/matthew/Code/Lgi/build/Lgi.build/Deployment/Lgi.build/Objects-normal/i386/Lgi

Und das ist die Kompilierung / link-Flags für die Anwendung:

    CompileC build/Scribe.build/Deployment/Scribe.build/Objects-normal/ppc/IHttp.o 
/Users/matthew/Code/Lgi/src/common/INet/IHttp.cpp normal ppc c++ com.apple.compilers.gcc.4_0
cd /Users/matthew/Code/Scribe-Branches/v2.00
/Developer/usr/bin/gcc-4.0 -x c++ -arch ppc -fmessage-length=0 -pipe -Wno-trigraphs 
-fpascal-strings -Os -mdynamic-no-pic -DMAC -DSCRIBE_APP -isysroot /Developer/SDKs/MacOSX10.4u.sdk 
-mtune=G4 -fvisibility=hidden -fvisibility-inlines-hidden -mmacosx-version-min=10.4 
-I/Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/Scribe.hmap 
-F/Users/matthew/Code/Scribe-Branches/v2.00/build/Deployment -F/Users/matthew/Code/Lgi/build 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment 
-I/Users/matthew/libpng-1.2.37 -I/Users/matthew/jpeg-6b -I../../Lgi/include/common 
-I../../Lgi/include/mac -I../../aspell-0.60.6/interfaces/cc 
-I/Users/matthew/Code/Scribe-Branches/v2.00/build/Deployment/include 
-IResources -I../Lgi/include/common -I../Lgi/include/mac 
-I/Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/DerivedSources/ppc 
-I/Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/DerivedSources 
-DMAC 
-include /var/folders/b4/b4LnxwCQGLCmwy36TH3QuU+++TQ/-Caches-/com.apple.Xcode.503/SharedPrecompiledHeaders/Scribe_Prefix-ebutivbeomfbzzguhklrzxnwuwzc/Scribe_Prefix.pch 
-c /Users/matthew/Code/Lgi/src/common/INet/IHttp.cpp 
-o /Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/Objects-normal/ppc/IHttp.o

Ld /Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/Objects-normal/i386/Scribe 
normal i386
cd /Users/matthew/Code/Scribe-Branches/v2.00
setenv MACOSX_DEPLOYMENT_TARGET 10.4
/Developer/usr/bin/g++-4.0 -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk 
-L/Users/matthew/Code/Scribe-Branches/v2.00/build/Deployment 
-F/Users/matthew/Code/Scribe-Branches/v2.00/build/Deployment 
-F/Users/matthew/Code/Lgi/build 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Development 
-F/Users/matthew/Code/Scribe-Branches/v2.00/../../Lgi/build/Deployment 
-filelist /Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/Objects-normal/i386/Scribe.LinkFileList 
-mmacosx-version-min=10.4 -framework Carbon -framework Lgi 
-o /Users/matthew/Code/Scribe-Branches/v2.00/build/Scribe.build/Deployment/Scribe.build/Objects-normal/i386/Scribe

Undefined symbols:
"non-virtual thunk to GWindow::OnDrop(char*, GVariant*, GdcPt2, int)", referenced from:
    vtable for ScribeWndin ScribeApp.o
    vtable for GShutdownin ScribeApp.o

Ich bin mir nicht sicher, was relevant, damit ich gepostet sie alle.

War es hilfreich?

Lösung 3

Ich habe ein kleines Beispiel Rahmen und App gemacht, die alle die gleichen Muster / Klasse heirarchies folgen, dass ich in meinem Haupt-app, mit Blick auf ein einfaches Beispiel des Problems zu machen. Aber das kompiliert und verknüpft. Ich konnte nicht sicher sein, ob das war, weil ich von ihm zu viel Code schneiden würde, oder weil durch die Projektdateien in der aktuellen Version von XCode Neuer hatte das Problem behoben.

So versuchen und Isolat, das dieser Fälle war wahr ich neu erstellt mein ganzes Rahmenprojekt von Grund auf neu (Vorspulen einige Stunden) und die in „Release“ (nicht Deployment) Modus und Links mit meiner Anwendung ohne Fehler baut! Huh? Ooooooooooooook.

Das bedeutet, dass die ursprüngliche Projektdatei in irgendeiner Weise gebrochen wird, die nicht leicht sichtbar in den Optionen ist. Ich diff'd alle Optionen gegen ein neu erstelltes Projekt und es ist ziemlich 1: 1. Nichts offensichtlich anders. Es ist also etwas in der Optionsdatei nicht sichtbar. Ein Problem, das ich hatte ist zu bemerken nicht, dass die Projektoptionen tatsächlich unterschiedlich sind zu den Zieloptionen. Nun, da ich weiß, an beiden Orten suchen ich sehen kann, wo einige „benutzerdefiniert“ Optionen sind in die Quere.

Die alte Projektdatei hat mehr Betriebssystem-Upgrades und zahlreichen XCode-Upgrades durchgemacht ... Ich denke, es möglich ist, haben einige der Upgrades in Konflikt geraten und das Projekt durcheinander. Also vielen Dank für das Lesen und für Ihre Kommentare.

Update: Nun, nachdem "Release" -Modus zu Kompilierung bekommen, wissen Sie was? Yup Debug NICHT kompilieren. ARRRRGGGGGGGHHHHH !! Also habe ich über alle Einstellungen für den Rahmen kopiert haben, so dass die Debug-Build ist genau das gleiche wie der Release-Build für beide Ziel und Project. Das nicht-Link. Arbeit geht weiter ...

Es stellt sich heraus, dass die letzte Differenz zwischen der Freigabe und Debug-Builds des App ist, dass ich die Definition „_DEBUG“ für das Debug-Build. Welche Schalter auf verschiedene Dinge wie behauptet und einige zusätzliche Debug-API ist. Jetzt muss ich arbeiten heraus, welche davon ist die Verbindungsfehler verursacht wird.

Andere Tipps

Gefunden diesen Beitrag von Matt, vermutlich jemand bei Apple: http : //lists.apple.com/archives/unix-porting/2003/Dec/msg00107.html

Darin Matt sagt:

  

[A nicht-virtuelle Thunk ist] ein interne   Implementierungsdetail für C ++ verwendet   Klassenhierarchien, die beinhalten   Mehrfachvererbung. Sie sind nicht zu tun   etwas falsch; dies ist ein Compiler   Fehler. Wir wissen, dass wir es beheben müssen.   In der Zwischenzeit ist die beste Abhilfe   wir kennen das gleiche zu verwenden ist   Optimierungsstufe für die Verknüpfung gegen   eine Bibliothek, dass Sie das Kompilieren verwendet   Bibliothek.

     

(Sie auch interessieren könnten nicht exportieren   ein C ++ Schnittstelle aus einer Bibliothek. Wir   sehr hart arbeiten, um sicherzustellen, dass die C   und Objective C ABI bleibt gleich   von einem Compiler Version zur nächsten,   aber wir machen keine solche Versprechen für C ++.)

      --Matt

Also vielleicht versuchen Sie eine C ++ Bibliothek zu verwenden, die von einer unterschiedlich versioniert C ++ Compiler kompiliert wurden? Das C ++ ABI ist nicht als tragbar definiert es scheint.

Reid

Warum nicht die Compiler ändern Flaggen Ihrer Produktion bauen zu denen, die Sie für die Entwicklung verwenden und sie dann nach und nach Aussehen zurück, wie die Produktion Flags, die Sie jetzt einer zur Zeit verwenden, bis Sie die fangen, die das Problem verursacht?

Dann können Sie diese Fahne in der gcc Handbuch nachschlagen und tiefer graben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top