Maison > développement back-end > Golang > le corps du texte

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

DDD
Libérer: 2024-11-21 14:19:14
original
594 Les gens l'ont consulté

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
Copier après la connexion

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
    Copier après la connexion
  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
    Copier après la connexion
  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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal