2008-10-09 9 views
1

J'essaie d'utiliser une bibliothèque statique créée par moi dans Visual C++ 2005 (C++ non géré). Je déclare une fonction "int myF (int a);" dans un fichier .h, je l'implémente dans un fichier .cpp, je le compile - le fichier .lib est produit.Problème avec la bibliothèque statique en C++

Je crée un nouveau projet (une solution séparée) dans VC++ 2005 (également C++ natif), j'ajoute les chemins pour le fichier include et le fichier lib; lorsque j'appelle la fonction myF, l'éditeur de liens signale une erreur: "erreur LNK2019: symbole externe non résolu _myF référencé dans la fonction _main". Si je crée le projet client dans la même solution que le projet de bibliothèque et ajoute ensuite une référence aux projets de la bibliothèque, cela fonctionne, mais je ne vais pas tout implémenter comme ça, mais plutôt ajouter des bibliothèques externes à mes projets.

Qu'est-ce qui ne va pas?

Merci. Essayez de définir des dépendances supplémentaires dans l'entrée de l'éditeur de liens pour les propriétés d'un projet.

Répondre

2

Vous devez également inclure le fichier .lib réel dans votre 2ème projet (pas seulement le chemin d'accès).

Il devrait y avoir une option dans les paramètres de l'éditeur de liens pour ce faire.

2

Il ne suffit pas de lister le dossier dans lequel MyStatic.lib peut être trouvé. Vous devez indiquer explicitement à l'éditeur de liens que Dependant.vcproj utilise MyStatic.lib.

Dans VS2005, vous faites cela par les propriétés du projet-> Linker-> Input-> Dépendances supplémentaires. Vous pouvez également saupoudrer des éléments de prépresse dans le fichier .h pour indiquer au compilateur d'indiquer à l'éditeur de liens d'utiliser MyStatic.lib.

Edit: La magie de préprocesseur va comme ceci

#pragma comment(lib, "MyStatic.lib") 
1

(EDIT: Ce fut une réponse à la question d'obtenir la/erreur NODEFAULTLIB en phase de lien qui a maintenant été supprimé ... haussant les épaules)

Vous mélangez les paramètres du compilateur si vous obtenez l'erreur defaultlib. Par exemple, si vous construisez votre bibliothèque dans debug et que vous construisez votre main dans la version, vous obtiendrez cette erreur car ils sont construits pour utiliser différentes versions de la CRTL. Cela peut également se produire si vous utilisez des paramètres différents pour la liaison avec C Runtime en tant que bibliothèque d'objets ou en tant que DLL. (Voir les options C/C++, section "Génération de code", sous le menu "Runtime Library")

Dans de nombreux projets, vous ne pouvez pas faire grand-chose si vous ne pouvez pas corriger les paramètres de la bibliothèque (par exemple, bibliothèques tierces). Dans ces cas, vous devez utiliser le commutateur/NODEFAULTLIB qui est une option de l'éditeur de liens dans la section "Entrée" appelée "Ignorer une bibliothèque spécifique". Mais puisque vous avez le contrôle de la bibliothèque principale et de la bibliothèque, créez une version de débogage et une version de votre fichier LIB ou assurez-vous que vos paramètres "Génération de code C/C++; Génération de code" correspondent aux deux projets.

Questions connexes