Domanda

sto ottenendo questi errori thunk non virtuali solo nella build di distribuzione di mia app. Esso utilizza un quadro privata chiamata Lgi. Basandosi su 10.5.8 utilizzando XCode 3.1.4 (più recente per il leopardo?) L'errore è simile al seguente:

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....

In ogni caso so che non sto lasciando quelli undefined perché lo fa in collegamento realtà ed eseguire bene nella build di sviluppo. Ora, dopo googling il problema la prima cosa da provare sta cambiando l'impostazione di ottimizzazione, che ho fatto ... e niente da fare. Qualche errore di collegamento.

Quindi, queste funzioni virtuali sono inizialmente definiti in GDragDropTarget, e l'eredità di GWindow aspetto:

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

(LgiClass essendo per l'esportazione __declspec / importazione su win32)

Tutte le idee su che cosa da provare dopo?

A proposito questo è alcune bandiere di esempio per il quadro:

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

E questo è il flag di compilazione / link per l'applicazione:

    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

Non sono sicuro che cosa è rilevante così li ho postato.

È stato utile?

Soluzione 3

Ho fatto un piccolo quadro esempio e app che seguono tutte le stesse gerarchie modelli / classe che uso nella mia app principale, con una vista verso fare un semplice esempio del problema. Ma che compilato e collegato. Non potevo essere sicuro se questo era perché avevo tagliato troppo codice da essa, o perché ricreando i file di progetto nella versione corrente di XCode aveva risolto il problema.

Quindi, cercare e isolare, che di quei casi era vero ho ricreato il mio intero progetto quadro da zero (avanzamento rapido alcune ore) e che costruisce in modalità e legami con la mia app senza errori (non distribuzione) "Release"! Eh? Ooooooooooooook.

Ciò significa che il file di progetto originale è rotto in qualche modo che non è facilmente visibile nelle opzioni. Ho diff'd tutte le opzioni nei confronti di un progetto di nuova creazione ed è abbastanza 1: 1. Nulla ovviamente diverso. Quindi è qualcosa che non è visibile nel file delle opzioni. Un problema che ho avuto non è meno di notare che le opzioni di progetto sono in realtà diverse per le opzioni di destinazione. Ora che so di guardare in entrambi i posti dove posso vedere qualche "definiti dall'utente" opzioni sono sempre in mezzo.

Il file vecchio progetto ha attraversato diverse aggiornamenti del sistema operativo e numerosi aggiornamenti XCode ... Credo che sia possibile alcune delle Gli aggiornamenti sono in conflitto e incasinato il progetto. Quindi grazie per la lettura e per i vostri commenti.

Aggiornamento: Bene dopo modalità ricevendo "uscita" per compilare, indovinate un po '? Yup Debug NON compilare. ARRRRGGGGGGGHHHHH !! Così ho copiato su tutte le impostazioni per il quadro in modo che la build di debug è esattamente la stessa della costruzione di uscita sia per Target e Project. Ciò non collega. Il lavoro continua ...

Si scopre che l'ultima differenza tra il rilascio e la build di debug di App, è che sto definendo "_DEBUG" per il build di debug. Che accende varie cose, come afferma e un po 'di debug API in più di. Ora devo capire quale di questi sta causando l'errore di collegamento.

Altri suggerimenti

Trovato questo intervento di Matt, presumibilmente qualcuno alla Apple: http : //lists.apple.com/archives/unix-porting/2003/Dec/msg00107.html

In esso, Matt dice:

  

[A thunk non virtuale è] un interno   dettaglio di implementazione utilizzato per C ++   gerarchie di classi che coinvolgono   ereditarietà multipla. Non si sta facendo   nulla di male; questo è un compilatore   bug. Sappiamo che abbiamo bisogno di risolvere il problema.   Nel frattempo, la migliore soluzione   che conosciamo è di utilizzare lo stesso   livello di ottimizzazione per il collegamento contro   una libreria che si è utilizzato per compilare il   biblioteca.

     

(Si potrebbe anche prendere in considerazione non esportare   un'interfaccia C ++ da una libreria. Noi   lavorare molto duramente per fare in modo che il C   e Objective C ABI rimane lo stesso   da una release del compilatore per il prossimo,   ma non offre alcuna tale promessa per C ++.)

      --Matt

Quindi, forse, si sta tentando di utilizzare una libreria C ++ che è stato compilato da un compilatore diverso-di versione C ++? Il C ++ ABI non è definito come portatile sembra.

Reid

Perché non cambiare le flag di compilazione della vostra produzione costruire a quelli che si utilizzano per lo sviluppo e poi cambiare a poco a poco di nuovo a guardare come la produzione di bandiere si utilizza ora uno alla volta fino a quando si cattura quello che causa il problema?

Poi si può guardare questo flag nella manuale di gcc e scavare più a fondo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top