Question

J'essaie d'utiliser la bibliothèque Oracle OCI avec le compilateur MingW64. Si je lie l'OCI.lib fourni par Oracle, mon programme 64 bits se bloque, car apparemment Mingw64 ne prend pas en charge la liaison avec DLL créée avec VC.

La solution de contournement semble être:

1) Générez un fichier DEF à partir de l'OCI.dll, que je fais avec Mingw64 Gendef (si j'utilise cette commande "Dlltool -z OCI.def --export-all-symbol oci.dll" J'obtiens un fichier DEF vide, Alors que si j'utilise Gendef, j'obtiens un fichier DEF peuplé)

2) Générer une bibliothèque d'importation OCI.A avec dlltool ("dlltool -d oci.def -l liboci.a")

Cependant, la bibliothèque OCI.A que je génère avec Dlltool est un fichier vide. Dans d'autres œuvres, il semble que je ne puisse pas générer cette bibliothèque OCI.A, que je devrais utiliser pour relier mon programme à l'OCI.dll

Quelqu'un sait-il comment résoudre ce problème? Quelqu'un est-il capable d'effectuer cette tâche correctement?

Merci

Marco

Était-ce utile?

La solution

Je viens de générer liboci.a sans aucun problème. Vous avez probablement gâché quelque chose ou utilisé une approche incorrecte (dlltool -z ...). Voici comment vous le faites:

  1. Télécharger et installer (peut construire à partir de la source) gendef utilitaire:

  2. Courir gendef oci.dll (Générera oci.def);

  3. Courir dlltool -D oci.dll -d oci.def -l liboci.a (Générera liboci.a);

  4. Essayez maintenant de créer un lien contre liboci.a.

REMARQUE: S'il vous plaît, assurez-vous que si vous oci.dll est ciblé à x86, alors dlltool devrait provenir de la distribution MingW / MingW-W64 qui cible également x86. Il en va de même pour le cas x64, c'est-à-dire qu'il est important que les architectures ciblées correspondent.

Autres conseils

Ce message peut ne pas s'appliquer à des systèmes 64 bits pour tout ce que je sais, mais il fonctionne sur des fenêtres 32 bits ...

J'ai essayé Gendef et il n'a pas réussi à produire un fichier DEF. Ayant déjà résolu ce problème à mes propres fins en commençant à écrire des DLL, je suggère d'utiliser Tiny_impdef.exe de TCC, qui fonctionne. (TCC = Tiny C Compiler, par Fabrice Bellard, et plus tard, Grishka.) Quoi de plus, contrairement à Dlltool (et peut-être Gendef), il fonctionne si GCC a utilisé -S pour dépouiller la DLL de sortie ou non!

Utilisez Dlltool pour générer le fichier de bibliothèque * .a à partir du DEF, si vous utilisez GCC. TCC fera toute la construction de DLL et EXE, en utilisant seulement deux lignes de commande. J'ai un ensemble de commandes qui permettront que la DLL ou l'EXE soit construite par GCC ou TCC, les quatre combinaisons possibles fonctionnant.

Fichier par lots ci-dessous, pour piller à volonté ... Je suis sûr qu'il peut être amélioré, mais au moins cela fonctionne proprement tel quel.

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

Commandes REM TCC. Crée 3 fichiers, DLL et DEF, puis Exe. Rem e: coding tcc tcc.exe -shared e: coding tcc examples test_dll test_dll.c -oe: coding tcc exemples test_dll test_dll.dll rem e: coding tcc tcc Tcc.exe e: coding tcc exemples test_dll test_exe.c e: coding tcc exemples test_dll test_dll.def -oe: coding tcc exemples test_dll test_dll.exe

Commandes REM GCC. ATTENTION! A encore besoin de TCC de TCC! E: coding gcc bin gcc.exe -s -shared -ie: coding gcc include -mwindows e: coding tcc exemples test_dll test_dll.c -oe: coding tcc exemples Test_dll test_dll.dll e: coding tcc "tiny_impdef.exe" e: coding tcc exemples test_dll test_dll.dll> nul e: coding gcc mingw32 bin dlltool.exe -d E: coding tcc examples test_dll test_dll.def -le: coding tcc exemples test_dll libtest_dll.a e: coding gcc bin gcc.exe -s -ie: coding gcc Include -mwindows e: coding tcc exemples test_dll test_exe.c e: coding tcc exemples test_dll libtest_dll.a -oe: coding tcc exemples test_dll test_dll.exe

Démarrer e: coding tcc examples test_dll test_dll.exe

Pour l'exhaustivité, voici le code C pour la DLL de test:

#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);
}

Désolé pour les gummidgisms, mais j'ai dû commencer quelque part, et je n'ai jamais aimé Foo and Bar, ni Hello and World ... Voici l'Exe:

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

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top