Pergunta

Eu tenho uma DLL que exporta

extern "C" __declspec(dllexport) int __stdcall Foo( void );

Um despejo da DLL mostra

******************************************************************************
Section:             Exports
File Offset:         00001400 (5120)
  Flags:             00000000
  Time Stamp:        00000000
  Major Version:     0000
  Minor Version:     0000

Exports from simple.dll
  3 exported name(s), 3 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002104    3 0000 std::nothrow
    00001258    2 0001 Foo
    000020F8    1 0002 ___CPPdebugHook

******************************************************************************

Comecei com o seguinte arquivo def:

LIBRARY simple.dll 
EXPORTS
  Foo

Isso criou um arquivo lib com as seguintes exportações:

Exports
       ordinal    name
                  _Foo

Quando eu vincula -me a esta biblioteca, o vinculador do MSVC reclama que não pode encontrar _foo@0. Para corrigir esse problema, adicionei um alias ao arquivo def.

LIBRARY simple.dll 
EXPORTS
  Foo
  Foo@0=Foo

O que resulta em um arquivo lib com exportações

Exports
       ordinal    name
                  _Foo
                  _Foo@0

Agora o projeto vincula sem nenhum problema. No entanto, quando tento executá -lo, recebo a mensagem

"O ponto de entrada do procedimento Foo@0 não pôde estar localizado na biblioteca dinâmica de links simples.dll"

Parece que, embora eu tenha dito ao lib.exe que Foo@0 é um alias para Foo, ele ainda cria uma biblioteca de importação que tenta carregar "foo@0" por nome.

Existe uma maneira de obter a biblioteca de importação para carregar "foo" quando eu pedi "foo@0"?

Obrigado,

David

Foi útil?

Solução

Você teve a ideia certa tentando usar um pseudônimo ...

"Parece que a LIB não aceita formas alias (ela simplesmente ignorará a peça após o sinal igual); 2) assume todas as funções no arquivo def __cdecl. O segundo ponto está no fato de que a biblioteca de importação que ele produz será mapeada Cada símbolo na DLL para um nome interno com um sublinhado prefixado, ou seja, o vinculador usando a biblioteca de importação tentará resolver um símbolo indefinido _função para a função de símbolo na DLL. Não é preciso cuidado especial da convenção de chamada __stdCall. Algumas técnicas que poderíamos usar a LIB para produzir bibliotecas de importação para funções __STDCALL, mas o chamador só poderia chamá-las por ordinal, não pelo nome. Os detalhes são deixados como um exercício :-) ". (http://wyw.dcweb.cn/stdcall.htm)

Em vez de usar um alias, use um ordinal: (usando seu exemplo):

LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)

Trabalhou para mim :)

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