Mac GCC не виртуальная ошибка Thunk - PullRequest
2 голосов
/ 30 марта 2010

Я получаю эти не виртуальные ошибки Thunk только в сборке развертывания моего приложения. Он использует частную среду под названием Lgi. Сборка на 10.5.8 с использованием XCode 3.1.4 (последняя версия для леопарда?) Ошибка выглядит следующим образом:

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

В любом случае, я знаю, что я не оставляю эти неопределенные, потому что они действительно связывают и работают нормально в сборке разработки. Теперь, после поиска проблемы, первое, что нужно попробовать, это изменить настройку оптимизации, что я и сделал ... и не играли в кости. Некоторая ошибка ссылки.

Итак, эти виртуальные функции изначально определены в GDragDropTarget, а наследование GWindow выглядит следующим образом:

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

(LgiClass для __declspec экспорта / импорта на win32)

Есть идеи, что попробовать дальше?

Кстати, вот несколько примеров флагов для фреймворка:

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

А это флаги компиляции / ссылки для приложения:

    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

Я не уверен, что имеет значение, поэтому я разместил их все.

Ответы [ 3 ]

4 голосов
/ 02 апреля 2011

Нашел этот пост от Мэтта, предположительно, кто-то в Apple: http://lists.apple.com/archives/unix-porting/2003/Dec/msg00107.html

В нем Мэтт говорит:

[Не виртуальный звук - это] внутренний детали реализации, используемые для C ++ иерархии классов, которые включают множественное наследование. Ты не делаешь ничего плохого; это компилятор ошибка. Мы знаем, что нам нужно это исправить. Между тем, лучший обходной путь мы знаем о том, чтобы использовать то же самое уровень оптимизации для связи с библиотека, которую вы использовали для компиляции библиотека.

(Вы также можете не экспортировать интерфейс C ++ из библиотеки. Мы работать очень усердно, чтобы убедиться, что С и цель C ABI остается прежней от одного выпуска компилятора к следующему, но мы не даем такого обещания для C ++.)

      --Matt

Так, возможно, вы пытаетесь использовать библиотеку C ++, которая была скомпилирована компилятором C ++ с разными версиями? Кажется, C ++ ABI не определяется как переносимый.

Reid

1 голос
/ 25 апреля 2010

Я создал крошечный пример фреймворка и приложения, которые следуют тем же шаблонам / классовым иерархиям, которые я использую в своем основном приложении, с целью сделать простой пример проблемы. Но это скомпилировано и связано. Я не был уверен, было ли это потому, что я вырезал из него слишком много кода или потому, что воссоздание файлов проекта в текущей версии XCode устранило проблему.

Так что попробуйте и изолируйте, какой из этих случаев был правдой. Я заново создал весь свой каркасный проект с нуля (ускоренная перемотка вперед на несколько часов), и ТО строится в режиме «Релиз» (не развертывание) и связывается с моим приложением без ошибок! А? Ooooooooooooook.

Это означает, что исходный файл проекта каким-то образом поврежден, что не так легко увидеть в настройках. Я сравнил все варианты с недавно созданным проектом, и это довольно 1: 1. Ничего явно не отличается. Так что это не видно в файле параметров. У меня была одна проблема - не замечать, что параметры проекта на самом деле отличаются от целевых. Теперь, когда я знаю, что искать в обоих местах, я вижу, где мешают некоторые «пользовательские» опции.

Старый файл проекта прошел несколько обновлений ОС и множество обновлений XCode ... Я думаю, что некоторые обновления конфликтуют и портят проект. Так что спасибо за чтение и за ваши комментарии.

Обновление: Ну, после компиляции режима "Release", угадайте что? Да, отладка не компилируется. ARRRRGGGGGGGHHHHH !! Итак, я скопировал все настройки для фреймворка, чтобы сборка Debug была точно такой же, как и сборка Release для Target и Project. Это не ссылка. Работа продолжается ...

Оказывается, что последнее различие между сборками Release и Debug приложения состоит в том, что я определяю "_DEBUG" для сборки отладки. Который включает различные вещи, такие как утверждения и некоторые дополнительные API отладки. Теперь мне нужно выяснить, какая из них вызывает ошибку ссылки.

1 голос
/ 24 апреля 2010

Почему бы не изменить флаги компилятора вашей производственной сборки на те, которые вы используете для разработки, а затем постепенно менять их обратно, чтобы они выглядели так, как если бы вы использовали те флаги, которые вы используете сейчас, по одному, пока не найдете те, которые вызывают проблему?

Тогда вы можете посмотреть этот флаг в руководстве по gcc и копать глубже.

...