2010-03-23 7 views
9

I sólo gd2 instalados utilizando los puertos mac (sudo instalar gd2), que instalan las bibliotecas en los siguientes lugares:biblioteca de configuración incluyen caminos en C++

/opt/local/include/gd.h 
/opt/local/lib/libgd.dylib (link) 
/opt/local/lib/libgd.la 
/opt/local/lib/libgd.a 

Aquí está mi archivo de maquillaje también:

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 

Así que cuando creo mi C++ aplicación que añadir '# include 'gd.h'', que lanza:

main.cpp:4:16: error: gd.h: No such file or directory 

Si fijo gd.h como una ruta absoluta (Como arriba) (no es una solución, pero tenía curiosidad), me meten:

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 

Por lo tanto, entiendo que esto significa que ld no pueda encontrar las librerías que necesita (por lo tanto tratar de darle insinúa con el " -L "valores). Entonces, después de dar a g ++ las sugerencias -L y la ruta absoluta en #include, puedo hacer que funcione, pero no creo que tenga que hacer esto, ¿cómo puedo hacer g ++/ld buscar en los lugares correctos para las bibliotecas? ?

Drew J. Sonne.

PS. usando: - OSX 10.6.2 - gcc versión 4.2.1 (Apple Inc. construir 5646) (punto 1)

EDIT: Ok, así que después de gd teniendo en cuenta stfanB y la respuesta de Michael, he recompilado en un directorio local (libraries) y por lo tanto, he cambiado esa primera línea de mi Makefile (¡Sin duda echa un vistazo a cmake) a g++ -L./libraries/lib -I./libraries/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap Pero sigo teniendo main.cpp:3:16: error: gd.h: No such file or directory

EDIT: Gracias a todos por las respuestas , aquí está mi makefile final (de trabajo) para cualquier otra persona que quiera una respuesta:

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 

Respuesta

14

En lugar de invocar g ++ directamente, le recomiendo encarecidamente que use CMake (mire CMake Google Techtalk si desea obtener más información), ya que simplificará su vida y simplifica enormemente la localización y el enlace de una variedad de bibliotecas. Dicho esto, creo que el problema con su invocación es que no ha especificado la biblioteca, lo que haría con -lgd. Su -L/opt/local/lib le dice correctamente a g ++ que mire en /opt/local/lib, pero nunca le dijo qué buscar. En cuanto a encontrar el encabezado apropiado, puede usar -I/opt/local/include para poner /opt/local/include en la ruta de búsqueda de inclusión del compilador.

Si se va a prestar atención a mi consejo para utilizar CMake, hacer esto sería el resultado:

 
FIND_PACKAGE(GD2 REQUIRED) 
INCLUDE_DIRECTORIES(${GD2_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${GD2_LIBRARY_DIRS}) 

ADD_EXECUTABLE(heatmap main Heatmap_Map Heatmap_Point) 
TARGET_LINK_LIBRARIES(heatmap ${GD2_LIBRARIES}) 

Si usted está interesado en aprender más acerca de CMake, es posible que desee echar un vistazo a la C++ Application Project Template y C++ Library Project Template , que hacen uso del sistema de compilación CMake. CMake está disponible a través de MacPorts a través del comando "sudo port install cmake".

En caso de que no está interesado en la instalación de CMake, también debería señalar que hay algunas variables de entorno que puede estar interesado en saber acerca de hacer la vida más fácil, a saber:

  • CPATH
  • LIBRARY_PATH
  • DYLD_FALLBACK_LIBRARY_PATH

el CPATH variable de entorno es muy similar a la variable de entorno PATH (es una de colon separa lista o f directorios), excepto que gcc y g ++ usarán automáticamente los directorios en esa variable como si estuvieran especificados en la línea de comando con el indicador -I (es decir, los encabezados se buscarán en esos caminos). El LIBRARY_PATH es el equivalente, excepto que es como si las carpetas se hubieran dado con -L (es decir, las bibliotecas se buscarán automáticamente en esa ruta). DYLD_FALLBACK_LIBRARY_PATH será utilizado por el enlazador dinámico (por lo que probablemente debería incluir las rutas desde LIBRARY_PATH en esta variable).

Puedes leer más sobre environment variables affecting gcc en el enlace.

+0

He estado usando JamPlus últimamente y me gusta bastante. –

1

Los directorios de encabezado incluyen deben especificarse con la opción -I (solo se necesitan rutas relativas después de esto) y el vinculador incluye directorios con -L (rutas relativas aquí también).

Para las bibliotecas, una alternativa podría establecer alternativamente LD_LIBRARY_PATH pero el método -L es más seguro.

+1

@Sameer, utilizó correctamente el distintivo -L pero olvidó especificar una biblioteca con -l. –

3

La respuesta es bastante complicada.

La respuesta corta, al compilar sus propias librerías/herramientas que coloquen en algún directorio local como las usadas por encima o por /usr/local/lib y /usr/local/include o incluso ~/local/lib y ~/local/include y siempre añadir de inmediato a su compilador/enlazador.

La respuesta más larga - leer Programming Library HOWTO para Linux que explica lo que cada uno de la herramienta busca, a partir del compilador/enlazador involucrados con la ejecución, y echar un vistazo a norma directory structure of Linux system la que por supuesto no es vinculante, pero es bueno saber.

Supongo que tiene una configuración simple de Makefile para cada uno de sus proyectos, por lo que no tiene que preocuparse por escribir todos esos comandos. Si no lo hace, le recomiendo configurar una plantilla simple de Makefile que pueda reutilizar para sus proyectos.

EDITAR:

En su respuesta editado los caminos puede ser incorrecta.

El . en su ruta como ./libraries especifica el directorio actual, lo que significa que buscará en el directorio libraries en el directorio actual. Si usted ción libraries directorio en el directorio raíz continuación, retire la . por lo que debe ser como este -L/libraries/lib y lo mismo para -I/libraries/...

+0

@Michael parece que aprendió algo de otras respuestas, así que probablemente otras respuestas no sean completamente irrelevantes, como creías. – stefanB

+0

@Michael, tienes el tic, pero stefanB tiene razón, obtuve más de las otras respuestas también. ;-) @stefanB, sí, lo puse en mi directorio de proyectos. – Drew

+0

Me alegro de que todos podamos ayudarle ... los puntos no son importantes – stefanB

1

Creo que su problema puede ser que sus argumentos -I tienen que pasar a la etapa de compilación, también. Tal vez algo como esto?

dev: main.o 
    g++ -L/opt/local/lib -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap 

main.o: main.cpp 
    g++ -I/opt/local/include -c main.cpp 

No seguro- No he utilizado los archivos make en 20 años (pero como he mencionado en un comentario a otro puesto, encuentro JamPlus bastante notable en su poder).

De todos modos, por lo general, las banderas del compilador y del enlazador se incluirán en variables y luego se expandirán en la línea de comandos, pero no estoy seguro de la sintaxis de make para eso. Tal vez simplemente:

CFLAGS=-I/opt/local/include 
LINKFLAGS=-L/opt/local/lib -lgd -lpng -lz -ljpeg -lfreetype -lm 

dev: main.o 
    g++ $(LINKFLAGS) main.o -o heatmap 

main.o: main.cpp 
    g++ $(CFLAGS) -c main.cpp 
+0

@ dash-tom-bang, FYI, CXXFLAGS se utilizan generalmente para configuraciones de C++ mientras que LDFLAGS se usan para indicadores de enlazadores. Debería usar la variable predefinida $ (CXX) como el compilador de C++ en lugar de la codificación rígida en g ++. Además, main.o: main.cpp se define automáticamente. Especificar main.o como una dependencia es suficiente para hacer que Make compile automáticamente main.cpp utilizando el compilador predeterminado de C++ y usando cualquier configuración especificada en CXXFLAGS. –

+0

@Michael gracias. –