Pergunta

Estou tentando usar a biblioteca Oracle OCI com o compilador Mingw64. Se eu vincular o OCI.lib fornecido pela Oracle, meu programa de 64 bits falha, porque aparentemente o MingW64 não suporta a ligação à DLL criada com o VC.

A solução alternativa para isso parece ser:

1) Gere um arquivo def The Oci.dll, o que estou fazendo com o Mingw64 Gendef (se eu usar este comando "dlltool -z oci.def --export-all-symbol oci.dll" Eu recebo um arquivo def em vazio, Enquanto eu usar o Gendef, recebo um arquivo def powuld)

2) Gere uma biblioteca de importação OCI.A com DLLtool ("Dlltool -d oci.def -l liboci.a")

No entanto, a biblioteca da OCI. que eu gero com o DLLtool é um arquivo vazio. Em outros trabalhos, parece que não sou capaz de gerar esta biblioteca OCI.

Alguém sabe como resolver esse problema? Alguém pode executar essa tarefa corretamente?

obrigada

Marco

Foi útil?

Solução

Acabei de gerar liboci.a sem problemas. Provavelmente você estragou algo ou usou uma abordagem incorreta (dlltool -z ...). Aqui está como você faz isso:

  1. Baixe e instale (pode construir a partir da fonte) gendef Utilitário:

  2. Corre gendef oci.dll (irá gerar oci.def);

  3. Corre dlltool -D oci.dll -d oci.def -l liboci.a (irá gerar liboci.a);

  4. Agora tente vincular contra liboci.a.

NOTA: Por favor, certifique -se de que se o seu oci.dll é direcionado para x86, então dlltool Deve ser da distribuição Mingw/Mingw-W64 que também está visando o X86. O mesmo vale para o caso X64, ou seja, é importante que as arquiteturas direcionadas correspondam.

Outras dicas

Esta postagem pode não se aplicar a sistemas de 64 bits para tudo o que sei, mas funciona com janelas de 32 bits ...

Eu tentei o Gendef e não conseguiu produzir um arquivo def. Tendo já resolvido esse problema para meus próprios propósitos no começo de escrever DLLs, sugiro usar tiny_impdef.exe do TCC, que funciona. (TCC = Tiny C Compiler, de Fabrice Bellard, e mais tarde, Grishka.) Além disso, ao contrário do DLLtool (e possivelmente Gendef), funciona se o GCC usou -S para retirar a dll de saída ou não!

Use o DLLtool para gerar o arquivo de biblioteca *.a a partir do def, se estiver usando o GCC. O TCC fará toda a construção de DLL e EXE, usando apenas duas linhas de comando. Eu tenho um conjunto de comandos que permitirão que a DLL ou o EXE seja construída pelo GCC ou TCC, com todas as quatro combinações possíveis funcionando.

Arquivo em lote abaixo, para pilhagem à vontade ... Tenho certeza de que pode ser melhorado, mas pelo menos funciona de maneira limpa.

@ECHO OFF
REM This system seems to work regardless of which compiler makes the DLL or the EXE. Try to simplify for GCC.

Rem TCC Comandos. Cria 3 arquivos, DLL e def, depois exe. Rem e: coding tcc tcc.exe -shared e: coding tcc exemplos test_dll test_dll.c -oe: coding tcc exemplos test_dll test_dll.dll Rem E: coding tcc Tcc.exe e: coding tcc exemplos test_dll test_exe.c e: coding tcc exemplos test_dll test_dll.def -oe: coding tc Exemplos test_dll dll.exe

Comandos Rem GCC. AVISO! Ainda precisa de Tiny_Impdef.exe do TCC! E: coding gcc bin gcc.exe -s -shared -ie: coding gcc incluir -mwindows e: coding tcc exemplos test_dll test_dll.c -e: coding tcc examles Test_dll test_dll.dll e: coding tcc "tiny_impdef.exe" e: coding tcc exemplos test_dll test_dll.dll> nul e: coding gcc mingw32 dll dll> E:CODINGTCCEXAMPLESTest_DLLTest_DLL.def -lE:CODINGTCCEXAMPLESTest_DLLlibTest_DLL.a E:CODINGGCCBINGCC.EXE -s -IE:CODINGGCC Incluir -mwindows e: coding tcc exemplos test_dll test_exe.c e: coding tcc exemplos test_dll liBtest_dll.a -e: coding tcc exemplos test_dll test_exll.exll.ae: coding tcc Exemplos test_dll e

Iniciar e: coding tcc exemplos test_dll test_dll.exe

Para completude, aqui está o código C para a DLL de teste:

#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)

DLL_EXPORT void ZoodleWurdle(){
  MessageBox (0, "Wurdle", "Zoodle", MB_ICONINFORMATION);
}

DLL_EXPORT void MangleWurzel(){
  MessageBox (0, "Mangled", "Wurzels", MB_ICONINFORMATION);
}

Desculpe pelos gummidgismos, mas eu tive que começar em algum lugar, e nunca gostei de Foo e Bar, ou olá e mundo ... aqui está o exe:

#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top