Maison développement back-end C++ Problèmes de bibliothèque partagée uniques

Problèmes de bibliothèque partagée uniques

Apr 03, 2025 pm 08:00 PM
c语言 ai red 2025

Problèmes de bibliothèque partagée uniques

Description du problème

Récemment, lorsque j'ai essayé de relier une bibliothèque partagée en langue C auto-construite à un projet local, j'ai rencontré une erreur de lien et j'ai invité une "référence non définie". Le message d'erreur est le suivant:

 <code>/bin/ld: /tmp/cchb7mj8.o: in function `sdl_main': main.c:(.text 0x3c): undefined reference to `sdl_enterappmaincallbacks' ... (其他类似的未定义引用) ... collect2: error: ld returned 1 exit status make: *** [makefile:7: all] error 1</code>
Copier après la connexion

Processus de dépannage

Essayant de recompiler la bibliothèque plusieurs fois et d'essayer différentes méthodes, aucune d'entre elles n'a fonctionné. Après avoir recherché des informations pertinentes sur les moteurs de recherche, j'ai constaté que quelqu'un rencontrait des problèmes similaires dans un forum, mais utilisait une chaîne d'outils 32 bits, tandis que ma chaîne d'outils était de 64 bits. Après avoir exclu les différences de version de la chaîne d'outils, envisagez d'essayer différents compilateurs.

Solution

Le problème a été résolu après la compilation initiale à l'aide de GCC et le passage à Clang.

Problème récidive et analyse

Pour comprendre la cause profonde du problème, un projet de test simple a été créé:

  • Lib.H:
 <code class="c">#pragma once int add(int a, int b);</code>
Copier après la connexion
  • lib.c:
 <code class="c">#include "lib.h" int add(int a, int b) { return ab; }</code>
Copier après la connexion
  • main.c:
 <code class="c">#include "lib.h" #include <stdio.h> int main () { printf("4 3=%d\n", add(4, 3)); return 0; }</stdio.h></code>
Copier après la connexion
  • build_so.sh (Clang compile la bibliothèque partagée):
 <code class="bash">clang -std=c11 -c -o lib.o lib.c clang -shared -fpic -o libm.so lib.o</code>
Copier après la connexion
  • build_main.sh (GCC compile le programme principal, les liens vers la bibliothèque partagée):
 <code class="bash">gcc -std=c11 -L. -l:libm.so main.c -o main</code>
Copier après la connexion

En utilisant le script ci-dessus, le lien a échoué avec une erreur de "référence" non définie "similaire:

 <code>/bin/ld: /tmp/ccymm8ki.o: in function `main': main.c:(.text 0x13): undefined reference to `add' collect2: error: ld returned 1 exit status</code>
Copier après la connexion

Cependant, si les compilateurs de build_so.sh et build_main.sh sont interchangeables (c'est-à-dire en utilisant GCC pour compiler la bibliothèque partagée et Clang compile le programme principal), le lien est réussi.

en conclusion

Ce problème peut être lié aux différences de traitement des symboles internes entre les compilateurs lors de la génération et de la liaison des bibliothèques partagées. Lorsque vous construisez des bibliothèques et des exécutables partagés avec différents compilateurs, vous devez vous assurer qu'ils sont compatibles. Bien que ce problème puisse être évité dans la plupart des cas en utilisant le même compilateur, cet exemple illustre des problèmes de compatibilité potentiels entre différents compilateurs. Si vous avez besoin d'utiliser différents compilateurs dans votre projet, vous devez revérifier et vous assurer que l'analyse symbolique se fait correctement entre eux.

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 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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comprendre les propriétés acides: les piliers d'une base de données fiable Comprendre les propriétés acides: les piliers d'une base de données fiable Apr 08, 2025 pm 06:33 PM

Une explication détaillée des attributs d'acide de base de données Les attributs acides sont un ensemble de règles pour garantir la fiabilité et la cohérence des transactions de base de données. Ils définissent comment les systèmes de bases de données gérent les transactions et garantissent l'intégrité et la précision des données même en cas de plantages système, d'interruptions d'alimentation ou de plusieurs utilisateurs d'accès simultanément. Présentation de l'attribut acide Atomicité: une transaction est considérée comme une unité indivisible. Toute pièce échoue, la transaction entière est reculée et la base de données ne conserve aucune modification. Par exemple, si un transfert bancaire est déduit d'un compte mais pas augmenté à un autre, toute l'opération est révoquée. BeginTransaction; UpdateAccountSsetBalance = Balance-100Wh

Master SQL Limit Clause: Contrôlez le nombre de lignes dans une requête Master SQL Limit Clause: Contrôlez le nombre de lignes dans une requête Apr 08, 2025 pm 07:00 PM

Clause SQLLIMIT: Contrôlez le nombre de lignes dans les résultats de la requête. La clause limite dans SQL est utilisée pour limiter le nombre de lignes renvoyées par la requête. Ceci est très utile lors du traitement de grands ensembles de données, des affichages paginés et des données de test, et peut améliorer efficacement l'efficacité de la requête. Syntaxe de base de la syntaxe: selectColumn1, Column2, ... FromTable_NamelimitNumber_Of_Rows; Number_OF_ROWS: Spécifiez le nombre de lignes renvoyées. Syntaxe avec décalage: selectColumn1, Column2, ... FromTable_Namelimitoffset, numéro_of_rows; décalage: sauter

Comment optimiser les performances MySQL pour les applications de haute charge? Comment optimiser les performances MySQL pour les applications de haute charge? Apr 08, 2025 pm 06:03 PM

Guide d'optimisation des performances de la base de données MySQL dans les applications à forte intensité de ressources, la base de données MySQL joue un rôle crucial et est responsable de la gestion des transactions massives. Cependant, à mesure que l'échelle de l'application se développe, les goulots d'étranglement des performances de la base de données deviennent souvent une contrainte. Cet article explorera une série de stratégies efficaces d'optimisation des performances MySQL pour garantir que votre application reste efficace et réactive dans des charges élevées. Nous combinerons des cas réels pour expliquer les technologies clés approfondies telles que l'indexation, l'optimisation des requêtes, la conception de la base de données et la mise en cache. 1. La conception de l'architecture de la base de données et l'architecture optimisée de la base de données sont la pierre angulaire de l'optimisation des performances MySQL. Voici quelques principes de base: sélectionner le bon type de données et sélectionner le plus petit type de données qui répond aux besoins peut non seulement économiser un espace de stockage, mais également améliorer la vitesse de traitement des données.

Méthode de Navicat pour afficher le mot de passe de la base de données MongoDB Méthode de Navicat pour afficher le mot de passe de la base de données MongoDB Apr 08, 2025 pm 09:39 PM

Il est impossible de visualiser le mot de passe MongoDB directement via NAVICAT car il est stocké sous forme de valeurs de hachage. Comment récupérer les mots de passe perdus: 1. Réinitialiser les mots de passe; 2. Vérifiez les fichiers de configuration (peut contenir des valeurs de hachage); 3. Vérifiez les codes (May Code Hardcode).

Master la clause Order Order by dans SQL: Trier efficacement les données Master la clause Order Order by dans SQL: Trier efficacement les données Apr 08, 2025 pm 07:03 PM

Explication détaillée de la clause SqlorderBy: le tri efficace de la clause de données d'ordre de données est une déclaration clé de SQL utilisée pour trier les ensembles de résultats de requête. Il peut être organisé en ordre ascendant (ASC) ou ordre décroissant (DESC) dans des colonnes uniques ou plusieurs colonnes, améliorant considérablement la lisibilité des données et l'efficacité de l'analyse. OrderBy Syntax selectColumn1, Column2, ... FromTable_NameOrderByColumn_Name [ASC | DESC]; Column_name: Triez par colonne. ASC: Ascendance Order Sort (par défaut). DESC: Trier en ordre décroissant. ORDERBY Fonctionnalités principales: Tri multi-colonnes: prend en charge le tri de plusieurs colonnes et l'ordre des colonnes détermine la priorité du tri. depuis

Y a-t-il une procédure stockée dans MySQL Y a-t-il une procédure stockée dans MySQL Apr 08, 2025 pm 03:45 PM

MySQL fournit des procédures stockées, qui sont un bloc de code SQL précompilé qui résume la logique complexe, améliore la réutilisabilité du code et la sécurité. Ses fonctions principales incluent des boucles, des instructions conditionnelles, des curseurs et un contrôle des transactions. En appelant des procédures stockées, les utilisateurs peuvent effectuer des opérations de base de données en entrant et en sortie, sans prêter attention aux implémentations internes. Cependant, il est nécessaire de prêter attention à des problèmes communs tels que les erreurs de syntaxe, les problèmes d'autorisation et les erreurs logiques, et de suivre les principes d'optimisation des performances et de meilleures pratiques.

Navicat se connecte au code et à la solution d'erreur de base de données Navicat se connecte au code et à la solution d'erreur de base de données Apr 08, 2025 pm 11:06 PM

Erreurs et solutions courantes Lors de la connexion aux bases de données: nom d'utilisateur ou mot de passe (erreur 1045) Blocs de pare-feu Connexion (erreur 2003) Délai de connexion (erreur 10060) Impossible d'utiliser la connexion à socket (erreur 1042) Erreur de connexion SSL (erreur 10055) Trop de connexions Résultat de l'hôte étant bloqué (erreur 1129)

Comment rédiger le dernier tutoriel sur la déclaration d'insertion SQL Comment rédiger le dernier tutoriel sur la déclaration d'insertion SQL Apr 09, 2025 pm 01:48 PM

L'instruction INSERT SQL est utilisée pour ajouter de nouvelles lignes à une table de base de données, et sa syntaxe est: Insérer dans Table_Name (Column1, Column2, ..., Columnn) VALEUR (VALEUR1, Value2, ..., Valuen);. Cette instruction prend en charge l'insertion de plusieurs valeurs et permet d'insérer des valeurs nulles dans des colonnes, mais il est nécessaire de s'assurer que les valeurs insérées sont compatibles avec le type de données de la colonne pour éviter de violer les contraintes d'unicité.

See all articles