Maison  >  Article  >  développement back-end  >  Comment résoudre les erreurs de liaison statique lors de la connexion à une base de données Oracle dans CGO sous Linux/Ubuntu ?

Comment résoudre les erreurs de liaison statique lors de la connexion à une base de données Oracle dans CGO sous Linux/Ubuntu ?

DDD
DDDoriginal
2024-11-21 14:19:14595parcourir

How to Resolve Static Linking Errors When Connecting to an Oracle Database in CGO on Linux/Ubuntu?

Dépannage de la liaison statique des bibliothèques Oracle dans les exécutables CGO sous Linux/Ubuntu

Vous essayez de créer un binaire statique qui se connecte à une base de données Oracle mais rencontrez une erreur pendant la phase de liaison. Voici une analyse détaillée et une solution à votre problème :

Erreur de liaison

/usr/bin/ld: cannot find -lclntsh

Cette erreur indique que le compilateur ne peut pas localiser la bibliothèque Oracle libclntsh.a.

Enquête

Votre configuration inclut déjà la version dynamique de la bibliothèque (-L/usr/lib/oracle/12.1/client64/lib -lclntsh) pour les liens dynamiques, mais vous devez utiliser la version statique (.a) pour les liens statiques.

Solution

Pour créer un exécutable CGO statique avec les bibliothèques Oracle, vous devez suivre ces étapes :

  1. Utilisez l'outil de relink d'Oracle : Utilisez l'outil $ORACLE_HOME/bin/relink pour générer la bibliothèque statique nommée libclntst.a :

    $ORACLE_HOME/bin/relink all
  2. Liez votre application avec libclntst.a : Essayez de lier votre application à la bibliothèque statique :

    CGO_ENABLED=1  go build -work -x -ldflags  " -v -linkmode external -extldflags -static" -L/usr/lib/oracle/12.1/client64/lib  oracletest.go
  3. Identifiez les symboles manquants : Si vous rencontrez des erreurs supplémentaires, utilisez l'outil nm pour rechercher la source de ces symboles manquants.
  4. Lien avec les bibliothèques manquantes :Lien avec les bibliothèques qui fournir les symboles manquants. Dans la plupart des cas, vous devrez établir un lien avec des bibliothèques Oracle supplémentaires ou des versions compilées statiquement de toute autre bibliothèque C dont dépendent vos bibliothèques Oracle.

Exemple

Par exemple, ce qui suit La commande crée avec succès un exécutable lié statiquement sur 11gR2 :

/usr/bin/c++ -Wall -ggdb3 -fPIC \
 CMakeFiles/opassgen.dir/opassgen.cpp.o \
 CMakeFiles/opassgen.dir/dbutils.cpp.o \
 CMakeFiles/opassgen.dir/common.cpp.o  \
 CMakeFiles/opassgen.dir/crypto.cpp.o  \
 n.o  -o opassgen                      \
 -rdynamic -static-libgcc -L. -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic \
 /home/oracle/ivan/openssl-1.0.1t/libcrypto.a  \
 /oracle/u01/db/11.2.0.4/lib/libclntst11.a     \
 /oracle/u01/db/11.2.0.4/lib/libippdcmerged.a  \
 /oracle/u01/db/11.2.0.4/lib/libippsmerged.a   \
 -Wl,--whole-archive libtrotl.a -Wl,--no-whole-archive \
 -lpthread -ldl

Conclusion

Construire statiquement les exécutables CGO liés aux bibliothèques Oracle peuvent être difficiles en raison des multiples dépendances des bibliothèques. En suivant les solutions fournies, vous pouvez générer avec succès un binaire statique qui se connecte à votre base de données Oracle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn