C++: obtenir Stimuler de travail; des questions sur le chemin d'inclusion et de liaison de la bibliothèque
J'ai essayé d'utiliser Boost.Générateur de jetons de la bibliothèque. Dans mon PROG.cpp
, j'ai le texte suivant:
#include <boost/tokenizer.hpp>
Et mon Makefile
a d'abord été quelque chose comme
CXX = g++-4.8
CXXFLAGS = ## some irrelevant flags
LDFLAGS = ## some irrelevant flags
SOURCES = PROG.cpp
OBJECTS = $(SOURCES:.cpp=.o)
TARGETS = PROG
$(TARGETS) : $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
## other targets
Il ne compile pas, depuis boost/tokenizer.hpp
ne peut pas être trouvé:
fatal error: boost/tokenizer.hpp: No such file or directory
Puis j'ai ajouté manuellement le boost chemin à CXXFLAGS
:
-I/opt/local/include/
(qui est le chemin de MacPorts.)
Ensuite, j'ai essayé d'inclure le Tokenizer de la bibliothèque, mais dans /opt/local/lib/
j'ai libboost_atomic-mt.dylib
, libboost_chrono-mt.dylib
, etc., mais rien de tel que tokenizer
. J'étais un peu perplexe à l'époque. Je suppose que n'aurait toujours pas de travail depuis la bibliothèque n'était pas lié à l'encontre. Étonnamment, le programme, en lien, et a fonctionné à la perfection.
Donc, je suis vraiment confus maintenant. Voici quelques questions:
(1) je n'ai pas de lien à l'encontre de stimuler de façon explicite, de sorte boost est considérée comme la norme de la bibliothèque par l'éditeur de liens?
(2) Si le boost est considérée comme la norme, pourquoi les en-têtes ne sont pas standard?
(3) Pourquoi il y a libboost_atomic-mt.dylib
, libboost_chrono-mt.dylib
, etc. mais pas tokenizer
? Qui dynamique de la bibliothèque ne tokenizer
appartient-il?
Je ne suis pas très familier avec g++
mécanisme de liaison; en parlant de coup de pouce, c'est mon tout premier programme avec boost. Donc j'apprécierais vraiment une explication détaillée. Merci à l'avance!
Pour la référence, c'est ce que j'ai extrait par gcc -print-search-dirs
:
install: /usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/
programs: =/usr/gcc-4.8.0/libexec/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/libexec/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/libexec/gcc/x86_64-apple-darwin12.3.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/bin/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/bin/
libraries: =/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/lib/x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../../x86_64-apple-darwin12.3.0/lib/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../x86_64-apple-darwin12.3.0/4.8.0/:/usr/gcc-4.8.0/lib/gcc/x86_64-apple-darwin12.3.0/4.8.0/../../../:/lib/x86_64-apple-darwin12.3.0/4.8.0/:/lib/:/usr/lib/x86_64-apple-darwin12.3.0/4.8.0/:/usr/lib/
OriginalL'auteur 4ae1e1 | 2013-05-10
Vous devez vous connecter pour publier un commentaire.
La plupart des bibliothèques boost, sont juste des fichiers d'en-tête, si vous regardez dans le .php les fichiers, vous ne verrez pas seulement la déclaration de la classe, comme vous pouvez attendre dans un fichier d'en-tête, mais en fait l'ensemble de la mise en œuvre. C'est pourquoi 90% des bibliothèques boost, vous n'avez pas besoin de s'inquiéter à propos des liens, seulement l'inclusion.
Cependant, pour un peu de bibliothèques, serialiser, quelques autres, il est juste trop polluer le code pour l'en-tête de l'inclusion de la méthode pour être raisonnable. Je suis sûr qu'il est mieux, plus rigide définition du sujet lors de la mise en œuvre est incluse dans l'en-tête et quand il ne l'est pas.
http://www.boost.org/boost-build2/doc/html/bbv2/faq/header-only-libraries.html
Voici une autre question à ce sujet:
Pourquoi ne sont pas toutes les bibliothèques boost d'en-tête uniquement?
p.s.
En général, il est préférable de garder la bibliothèque boost distinct et dans votre makefile faire quelque chose comme:
Pour la compilation:
CXXFLAGS += -I/path/to/boost/include
Pour La Liaison:
LDPATH += -L/path/to/boost/lib
Cela rend plus facile de mettre à niveau votre boost version que vous avez juste à modifier le chemin d'accès dans un seul endroit.
OriginalL'auteur Salgar