11
votes

Pourquoi ai-je besoin de compiler DateTime à Boost si je n'utilise pas to_string ou de_string?

Lors de la compilation d'un projet Visual Studio 2005 qui fait référence à un mélange de code géré / non géré C ++, je reçois l'erreur suivante:

1> Link: erreur fatale LNK1104: impossible d'ouvrir le fichier 'libboost_date_time-vc80-mt-1_42. lib ' p>

J'ai suivi le Mise en route Guide . De la pertinence est cet extrait: P>

"Boost.DateTime a un composant binaire qui n'est nécessaire que si vous utilisez ses fonctions TO_STRING / from__string ou de sérialisation, ou si vous ciblez Visual C ++ 6.x ou Borland."

P> blockQuote>

J'ai fait une recherche globale de "to_string" et "de_string". Il n'y a pas d'occurrence dans le code de ces méthodes DateTime. P>

dans le Documentation pour la bibliothèque DateTime elle-même , il y a cet extrait: P>

"La bibliothèque a quelques fonctions nécessitant la création d'un fichier de bibliothèque (surtout to_string, de fonctions de_string). b> La plupart des utilisateurs de la bibliothèque peuvent utiliser efficacement la bibliothèque sans construire la bibliothèque, mais simplement l'inclusion requise. Les en-têtes. Si la bibliothèque est nécessaire, le Jamfile dans le répertoire de construction produira une bibliothèque "statique" (libboost_date_time) et une bibliothèque "dynamique / partagée" (boost_date_time) contenant ces fonctions. "

P> BlockQuote>

Comment puis-je avoir sur la résolution de ce problème? La solution Easy est de construire la bibliothèque ou d'utiliser l'installateur binaire Windows de BoostPro, mais cela me dérange que la bibliothèque compilée est nécessaire lorsque, selon la documentation, je ne suis pas dans la situation qui l'exige. P>

Une autre question est la documentation DateTime semble indiquer que son "surtout to_string, de_string)", pourrait-on peut-être référencer une autre fonction qui nécessiterait de créer le fichier de bibliothèque? Est-ce que quelqu'un sait quelles autres fonctions sont incluses? Y a-t-il des fonctions qui elles-mêmes enveloppent ou appelent to_string ou de_string? P>

La seule inclusion que j'utilise est la suivante: P>

#include <boost/date_time/gregorian/gregorian.hpp>


0 commentaires

5 Réponses :


0
votes

Peut-être que vous incluez un "mauvais" en-tête qui déclenche le compilateur pour relier le lien avec la lib, même si vous n'en avez pas besoin. Recherchez un #Pragma Commentaire (Lib, ...) dans les en-têtes de boost pour savoir si tel est le cas.


1 commentaires

J'ai cherché les en-têtes de Boost Date_Time et la seule occurrence de Pragma était de désactiver un avertissement de compilateur sur MSVC construit pour leur "dépréciation" des fonctions locales / gmtime.



1
votes

Boost est livré avec un outil appelé BCP pouvant être utilisé pour extraire exactement le sous-ensemble dont vous avez besoin. Jetez un coup d'œil, sonne comme si vous le trouverez utile.


1 commentaires

Le BCP ne semble pas être beaucoup d'aide - l'exécuter en mode de rapport contre mes en-têtes de clé donnez plus de 1500 dépendances dans l'arborescence source de boost



6
votes

Le projet compile et relie proprement après le dépannage suivant:

J'ai défini boost_lib_diagnostic - pour voir quelle sortie de diagnostic je pouvais obtenir de la liaison automatique. Pas trop informatif:

1> Liaison à LIB File: libboost_date_time-vc80-mt-1_42.lib
1> Lien: erreur fatale LNK1104: impossible d'ouvrir le fichier 'libboost_date_time-vc80-mt-1_42.lib'

i ensuite défini boost_all_no_lib = 1 - désactive toutes les liaisons automatiques. Projet compile maintenant et lie proprement.

Les en-têtes de boost utilisent pragma pour signaler des compilateurs pour rechercher un fichier LIB. Alors que la bibliothèque Date_Time ne fait pas cela, d'autres en-têtes de boost dépendent de faire.


0 commentaires

13
votes

Il suffit d'ajouter: xxx

Avant d'inclure les en-têtes de boost dans votre code, par exemple: xxx

J'espère que cela vous aiderait, dans mon cas ça marche.


0 commentaires

4
votes

Dans mon cas, cette erreur ne se produit que sur MSVC Linker. Lors de la compilation avec CLANG ou GCC, il n'y a aucun problème. En ajoutant

#define BOOST_ALL_NO_LIB


0 commentaires