Question

Je reçois ces erreurs de thunk non virtuelles uniquement dans la version de déploiement de mon application. Il utilise un cadre privé appelé LGI. Miser sur 10.5.8 à l'aide XCode 3.1.4 (dernière pour le léopard?) L'erreur ressemble à ceci:

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

En tout cas je sais que je ne suis pas quitter les définissable car il fait en lien fait et fonctionnent très bien dans la version de développement. Maintenant, après googler la question la première chose à faire est de changer le paramètre d'optimisation, que je l'ai fait ... et pas de dés. Une erreur de lien.

Ainsi, ces fonctions virtuelles sont initialement définies dans GDragDropTarget, et l'héritage de GWindow ressemble à ceci:

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

(LgiClass étant destinés à l'exportation __declspec / importation win32)

Toutes les idées sur ce qu'il faut essayer la prochaine?

BTW ceci est quelques exemples de drapeaux pour le cadre:

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

Et voici les drapeaux de compilation / lien pour l'application:

    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

Je ne sais pas ce qui est pertinent pour que je les supplémentaires.

Était-ce utile?

La solution 3

Je l'ai fait un exemple de cadre minuscule et application qui suivent tous les mêmes modèles / de classe qui hiérarchies j'utiliser dans mon application principale, en vue à rendre un exemple simple du problème. Mais que compilé et lié. Je ne pouvais pas être sûr que c'était parce que je couperais trop de code de celui-ci, ou parce que, en recréant les fichiers du projet dans la version actuelle de XCode avait résolu le problème.

essayer et d'isoler ce qui de ces cas était vrai, je recréé mon ensemble du projet-cadre à partir de zéro (avance rapide quelques heures) et qui construit en mode « Release » (pas de déploiement) et des liens avec mon application sans erreur! Huh? Ooooooooooooook.

Cela signifie que le fichier projet d'origine est rompu d'une manière qui ne sont pas facilement visibles dans les options. Je diff'd toutes les options contre un projet nouvellement créé et il est assez 1: 1. Rien évidemment différent. Il est donc quelque chose de visible dans le fichier d'options. Un problème que je n'ai pas est remarqué que les options de projet sont en fait différentes des options cibles. Maintenant que je sais à regarder dans les deux endroits que je peux voir où certaines options de « définies par l'utilisateur » obtiennent de la manière.

L'ancien fichier de projet a été par plusieurs mises à niveau du système d'exploitation et de nombreuses améliorations XCode ... Je suppose qu'il est possible que certains des mises à jour ont foiré et conflictuel du projet. Donc, merci pour la lecture et pour vos commentaires.

Mise à jour: Eh bien après avoir obtenu le mode "Release" pour compiler, devinez quoi? Eh oui Debug ne compile pas. ARRRRGGGGGGGHHHHH !! J'ai donc copié sur tous les paramètres du cadre afin que le Debug est exactement la même que la version Release pour les deux cibles et projet. Cela ne lie pas. Le travail se poursuit ...

Il s'avère que la dernière différence entre la libération et debug de l'application, est que je définir « _DEBUG » pour la version de débogage. Qui commute sur diverses choses comme une API et affirme de débogage EXTRAS. Maintenant, je dois travailler sur ce qui est à l'origine de ceux qui l'erreur de lien.

Autres conseils

trouvé cette annonce de Matt, probablement quelqu'un chez Apple: http : //lists.apple.com/archives/unix-porting/2003/Dec/msg00107.html

Dans ce document, Matt dit:

  

[A thunk non virtuelle est] un interne   détail de mise en œuvre utilisé pour C ++   hiérarchies de classes qui impliquent   l'héritage multiple. Vous ne faites pas   quelque chose de mal; c'est un compilateur   punaise. Nous savons que nous devons corriger.   Dans le même temps, la meilleure solution   nous savons est d'utiliser le même   niveau d'optimisation pour relier contre   une bibliothèque que vous avez utilisé pour compiler le   bibliothèque.

     

(Vous pouvez également envisager ne pas exporter   une interface de C ++ à partir d'une bibliothèque. nous   travailler très dur pour vous assurer que le C   et Objective C ABI reste le même   d'une version du compilateur à l'autre,   mais nous ne faisons pas une telle promesse C ++).

      --Matt

Alors peut-être que vous essayez d'utiliser une bibliothèque C ++ qui a été compilé par un compilateur C ++ différemment versionné? Le C ++ ABI est pas défini comme il semble portable.

Reid

Pourquoi ne pas changer les drapeaux du compilateur de votre production construire à ceux que vous utilisez pour le développement, puis de les changer graduellement pour ressembler à la drapeaux production que vous utilisez maintenant un à la fois jusqu'à ce que vous attrapez celui qui cause le problème?

Ensuite, vous pouvez regarder ce drapeau dans le manuel gcc et creuser plus profond.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top