Pergunta

Estou recebendo esses erros não virtuais apenas na construção de implantação do meu aplicativo. Ele usa uma estrutura privada chamada LGI. Com base em 10.5.8 Usando o Xcode 3.1.4 (mais recente para Leopard?) O erro se parece com o seguinte:

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

De qualquer forma, eu sei que não estou deixando isso indefinido porque, de fato, link e corre bem na construção do desenvolvimento. Agora, depois de pesquisar o problema, a primeira coisa a tentar é alterar a configuração de otimização, o que eu fiz ... e sem dados. Algum erro de link.

Portanto, essas funções virtuais são definidas inicialmente no gdragdroptarget, e a herança de Gwindow se parece com a seguinte:

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

(LGICLASS sendo para __declspec export/importação no Win32)

Alguma idéia sobre o que tentar a seguir?

BTW, este é um exemplo de sinalizadores para a estrutura:

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 este é o sinalizador de compilação/link para o aplicativo:

    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

Não tenho certeza do que é relevante, então publiquei todos eles.

Foi útil?

Solução 3

Fiz uma pequena estrutura de exemplo e um aplicativo que segue os mesmos padrões/hinderarquias de classe que eu uso no meu aplicativo principal, com o objetivo de fazer um exemplo simples do problema. Mas isso compilou e vinculado. Eu não podia ter certeza se era porque eu cortava muito o código dele ou porque recriando os arquivos do projeto na versão atual do Xcode resolveu o problema.

Portanto, tente isolar qual desses casos foi verdadeiro, eu recriei todo o meu projeto de estrutura do zero (avanço rápido algumas horas) e que se baseia no modo "liberação" (não implantação) e vincula-se ao meu aplicativo sem erros! Huh? Oooooooooooooook.

Isso significa que o arquivo de projeto original é quebrado de alguma maneira que não é facilmente visível nas opções. Eu diferenciei todas as opções em relação a um projeto recém -criado e é bonito 1: 1. Nada obviamente diferente. Portanto, é algo não visível no arquivo de opções. Um problema que tive é não perceber que as opções do projeto são realmente diferentes das opções de destino. Agora que sei olhar nos dois lugares, posso ver onde algumas opções "definidas pelo usuário" estão atrapalhando.

O arquivo de projeto antigo já passou por várias atualizações do sistema operacional e inúmeras atualizações do Xcode ... Acho que é possível que algumas das atualizações conflitassem e confundiram o projeto. Então, obrigado pela leitura e por seus comentários.

Atualizar: Bem, depois de obter o modo de "liberação" para compilar, adivinhe? YUP Debug não compila. Arrrrgggggggghhhhh !! Por isso, copiei todas as configurações da estrutura, para que a construção de depuração seja exatamente a mesma que a versão de lançamento para Target e Project. Isso não vincula. O trabalho continua ...

Acontece que a última diferença entre a versão e a depuração do aplicativo é que estou definindo "_debug" para a construção de depuração. Que liga várias coisas como afirma e algumas APIs extras de depuração. Agora eu tenho que descobrir qual desses está causando o erro de link.

Outras dicas

Encontrei esta postagem de Matt, presumivelmente alguém na Apple: http://lists.apple.com/archives/unix-porting/2003/dec/msg00107.html

Nele, Matt diz:

Um Thunk não virtual é] um detalhe interno de implementação usado para hierarquias de classe C ++ que envolvem herança múltipla. Você não está fazendo nada de errado; Este é um bug do compilador. Sabemos que precisamos consertar isso. Nesse meio tempo, a melhor solução alternativa que conhecemos é usar o mesmo nível de otimização para vincular uma biblioteca que você costumava compilar a biblioteca.

(Você também pode considerar não exportar uma interface C ++ a partir de uma biblioteca. Trabalhamos muito para garantir que o C e o objetivo C ABI permaneçam o mesmo de uma liberação de um compilador para o próximo, mas não fazemos tal promessa para C ++.)

      --Matt

Então, talvez você esteja tentando usar uma biblioteca C ++ que foi compilada por um compilador C ++ de diferentes versões? O C ++ ABI não é definido como portátil, parece.

Reid

Por que não alterar os sinalizadores do compilador da sua produção para aqueles que você usa para o desenvolvimento e, em seguida, muda gradualmente de volta para parecer com os sinalizadores de produção que você usa agora um no momento até que você pegue o que causa o problema?

Então você pode procurar essa bandeira no manual do GCC e cavar mais fundo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top