Вопрос

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

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

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

Таким образом, эти виртуальные функции изначально определены в 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

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

Итак, попробуйте определить, какой из этих случаев был правдой, я воссоздал весь свой проект framework с нуля (перенесемся на несколько часов вперед), и ОН выполняется в режиме "Release" (не deployment) и связывается с моим приложением без ОШИБОК!А?Ооооооооооооок.

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

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

Обновить: Ну, после получения режима "Release" для компиляции, угадайте, что?Да, Debug НЕ компилируется.АРРРРГГГГГГГХХХХХ!!Итак, я скопировал все настройки для фреймворка, чтобы отладочная сборка была точно такой же, как и релизная сборка как для цели, так и для проекта.Это не имеет отношения.Работа продолжается...

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

Другие советы

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

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

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

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

      --Matt

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

Рид

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top