réglage de la bibliothèque des chemins à inclure, en c++
Je viens d'installer gd2 à l'aide de mac ports (sudo installer gd2), qui bibliothèques installées dans les endroits suivants:
/opt/local/include/gd.h
/opt/local/lib/libgd.dylib (link)
/opt/local/lib/libgd.la
/opt/local/lib/libgd.a
Voici mon fichier de créer aussi:
dev: main.o
g++ -L/opt/local/lib -I/opt/local/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap
main.o: main.cpp
g++ -c main.cpp
Alors quand j'ai créer mon c++ application, j'ai ajouter " #include "gd.h"', qui jette:
main.cpp:4:16: error: gd.h: No such file or directory
Si j'ai mis en gd.h comme un chemin d'accès absolu (comme ci-dessus)(et non pas une solution, mais il était curieux), je me suis jeté:
g++ -L/opt/local/include -L/opt/local/lib main.o -o heatmap
Undefined symbols:
"_gdImagePng", referenced from:
_main in main.o
"_gdImageLine", referenced from:
_main in main.o
"_gdImageColorAllocate", referenced from:
_main in main.o
_main in main.o
"_gdImageDestroy", referenced from:
_main in main.o
"_gdImageCreate", referenced from:
_main in main.o
"_gdImageJpeg", referenced from:
_main in main.o
ld: symbol(s) not found
Donc, je comprends cela signifie que les ld ne peut pas trouver les bibliothèques (et donc d'essayer de lui donner des astuces avec l'option "-L" valeurs). Donc, après avoir donné à g++- L conseils et le chemin d'accès absolu dans #include, je peux le faire fonctionner, mais je ne pense pas que je dois le faire, comment puis-je faire de g++/ld recherche int hein bons endroits pour les bibliothèques?
A Attiré J. Sonne.
PS. à l'aide de:
- OS x 10.6.2
- la version de gcc 4.2.1 (Apple Inc. construire 5646) (point 1)
EDIT:
Ok, donc après prise en compte de stfanB et Michael réponse, j'ai recompilé gd dans un répertoire local (libraries
) et donc, j'ai changé que la première ligne de mon fichier Makefile (je vais def découvrez cmake) à g++ -L./libraries/lib -I./libraries/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap
Mais je suis encore en train main.cpp:3:16: error: gd.h: No such file or directory
EDIT:
Merci à tous pour les réponses, voici ma dernière (de travail) makefile pour quelqu'un d'autre qui a beaucoup veulent une réponse:
dev: main.o
g++ -I./libraries/include -L./libraries/lib -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap
main.o: main.cpp
g++ -I./libraries/include -c main.cpp
OriginalL'auteur Drew | 2010-03-23
Vous devez vous connecter pour publier un commentaire.
Plutôt que d'appeler g++ directement, je vous conseille fortement d'utiliser CMake (regarder la CMake Google Techtalk si vous souhaitez en savoir plus, car il fera de votre vie de manière plus facile et simplifie grandement la localisation et de se lier à une variété de bibliothèques. Cela dit, je crois que le problème avec votre invocation, c'est que vous n'avez pas spécifié de la bibliothèque, qui vous le feriez avec
-lgd
. Votre-L/opt/local/lib
correctement dit g++ pour regarder dans/opt/local/lib
, mais vous n'avez jamais dit ce qu'il faut chercher. Comme pour trouver le bon en-tête, vous pouvez utiliser-I/opt/local/include
de mettre/opt/local/include
dans le compilateur d'inclure le chemin de recherche.Si vous tenez compte de mes conseils pour utiliser CMake, cela ressemblerait à:
Si vous êtes intéressés à en apprendre plus sur CMake, vous voudrez peut-être jeter un oeil à la C++ De L'Application Du Modèle De Projet et C++ De La Bibliothèque De Modèle De Projet, qui font usage de le système de compilation CMake. CMake est disponible via MacPorts, via la commande "sudo port install cmake".
Dans le cas où vous ne sont pas intéressés par l'installation de CMake, je dois aussi signaler qu'il y a certaines variables d'environnement que vous pourriez être intéressé à connaître pour rendre votre vie plus facile, à savoir:
La CPATH variable d'environnement est un peu comme la variable d'environnement PATH (c'est un colon liste de répertoires séparés), sauf que les répertoires dans cette variable sera utilisée automatiquement par gcc et g++ comme si ils ont été spécifiés sur la ligne de commande avec la
-I
drapeau (c'est à dire les en-têtes seront recherchés dans les chemins). Le LIBRARY_PATH est l'équivalent, sauf que c'est comme si les dossiers ont été donnés avec-L
(c'est à dire les bibliothèques seront automatiquement recherchées dans cette voie). DYLD_FALLBACK_LIBRARY_PATH sera utilisé par l'éditeur de liens dynamique (de sorte que vous devriez inclure les chemins de LIBRARY_PATH dans cette variable).Vous pouvez en lire plus sur le les variables d'environnement affectant la gcc sur le lien.
OriginalL'auteur Michael Aaron Safyan
La réponse est assez compliqué.
La réponse courte, lorsque vous compilez votre propre libs/les outils de la place dans certains
local
répertoire comme vous avez utilisé ci-dessus ou/usr/local/lib
et/usr/local/include
ou même~/local/lib
et~/local/include
et toujours les ajouter à votre compilateur/linker.La plus longue réponse - lire Bibliothèque de programmation HOWTO pour Linux, qui explique ce que chaque outil a nécessité cherche, à partir de compilateur/linker à l'exécution, et ont un look à la norme structure de répertoire de système Linux qui n'est évidemment pas de valeur contraignante, mais c'est bon à savoir.
Je suis en supposant que vous avez un simple fichier Makefile de configuration pour chacun de vos projets afin de ne pas avoir à se soucier de taper toutes les commandes. Si vous n'en avez pas, je vous recommandons vivement l'installation d'un simple fichier Makefile modèle que vous pouvez réutiliser pour vos projets.
MODIFIER:
Dans votre édité répondre à vos chemins d'accès peuvent être incorrectes.
La
.
dans votre chemin comme./libraries
spécifie le répertoire courant, signifie qu'elle va chercher danslibraries
répertoire dans le répertoire courant. Si vous mentlibraries
répertoire dans le répertoire racine, puis retirez le.
de sorte qu'il devrait être comme ceci-L/libraries/lib
et de même pour-I/libraries/...
vous avez la tique, mais stefanB du droit, j'ai obtenu plus de l'autre des réponses. 😉 @stefanB, oui, je l'ai mis dans mon projet, dir.
Je suis heureux que nous avons tous été en mesure pour vous aider à ... les points ne sont pas importants
d'accord. J'ai upvoted depuis votre modifier.
OriginalL'auteur stefanB
De l'en-tête répertoires doivent être spécifiée avec l'option-I (seulement les chemins d'accès relatifs nécessaire après ça) et l'éditeur de liens inclure des répertoires avec -L (chemins relatifs).
Pour les bibliothèques, alternative, vous pouvez également définir le LD_LIBRARY_PATH mais l'-L méthode est plus sûre.
OriginalL'auteur Sameer
Je pense que votre problème est peut-être que votre -j'ai les arguments doivent être passés à l'étape de la compilation, trop. Peut-être que quelque chose comme cela?
Pas sûr - je n'ai pas utilisé les makefiles en 20 ans (mais comme je l'ai mentionné dans un commentaire sur un autre post, je trouve JamPlus tout à fait remarquable dans sa puissance).
De toute façon généralement de votre compilateur et l'éditeur de liens drapeaux seront mis dans des variables, puis élargi dans la ligne de commande, mais je ne suis pas sûr que sur la syntaxe pour que. Peut-être tout simplement:
merci.
OriginalL'auteur dash-tom-bang
Vous devez utiliser -iquote lors de l'utilisation de #include "gd.h", voir la gcc options du répertoire de la documentation.
Aussi, en spécifiant le répertoire include dans votre lien étape est inutile.
OriginalL'auteur santeri