Я просто установил gd2 с помощью портов Mac (sudo, устанавливают gd2), который установил библиотеки в следующих местах:
/opt/local/include/gd.h
/opt/local/lib/libgd.dylib (link)
/opt/local/lib/libgd.la
/opt/local/lib/libgd.a
Вот мой make-файл также:
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
Таким образом, когда я создаю свое приложение C++, я добавляю '#include "gd.h"', который бросает:
main.cpp:4:16: error: gd.h: No such file or directory
Если я установил gd.h как полный путь (как выше) (не решение, но было любопытно), я брошен:
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
Так, я понимаю, что это означает, что ld не может найти библиотеки, в которых он нуждается (следовательно пытающийся дать ему подсказки со значениями "-L"). Таким образом, после предоставления g ++-L подсказывает и полный путь в #include, я могу заставить это работать, но я не думаю, что должен сделать это, как я могу заставить g ++/ld искать интервал а правильные места для библиотек?
Drew J. Sonne.
PS. использование: - OSX 10.6.2 - gcc версия 4.2.1 (сборка Apple Inc. 5646) (точка 1)
Править: Хорошо, поэтому после принятия во внимание stfanB и ответа Michael, я перекомпилировал gd в локальный каталог (libraries
) и таким образом, я изменил ту первую строку своего Make-файла (я буду выезд определения cmake) к g++ -L./libraries/lib -I./libraries/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap
Но я все еще добираюсь main.cpp:3:16: error: gd.h: No such file or directory
Править: Спасибо все для ответов, вот мой заключительный (рабочий) make-файл для кого-либо еще, который многие хотят ответ:
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
Вместо прямого вызова g ++ я настоятельно рекомендую вам использовать CMake (посмотрите CMake Google Techtalk , если вы хотите узнать больше), поскольку он облегчит вам жизнь и значительно упростит поиск и связывание с различными библиотеками. Тем не менее, я считаю, что проблема с вашим вызовом заключается в том, что вы не указали библиотеку, что вы бы сделали с помощью -lgd
. Ваш -L / opt / local / lib
правильно указывает g ++ искать в / opt / local / lib
, но вы никогда не говорили ему, что искать. Что касается поиска подходящего заголовка, вы можете использовать -I / opt / local / include
, чтобы поместить / opt / local / include
в путь поиска компилятора include.
Если бы вы прислушались к моему совету использовать CMake, это выглядело бы так:
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})
Если вы хотите узнать больше о CMake, вы можете взглянуть на Шаблон проекта приложения C ++ и Шаблон проекта библиотеки C ++ , в которых используется система сборки CMake. CMake доступен через MacPorts с помощью команды «sudo port install cmake».
Если вы не заинтересованы в установке CMake, я также должен указать, что есть некоторые переменные среды, которые вам может быть интересно узнать, чтобы облегчить вашу жизнь, а именно:
Переменная среды CPATH очень похожа на переменную среды PATH (это список каталогов, разделенных двоеточиями), за исключением того, что каталоги в этой переменной будут автоматически использоваться gcc и g ++, как если бы они были указаны в командной строке с флагом -I
(т.е. по этим путям будет выполняться поиск заголовков). LIBRARY_PATH является эквивалентом, за исключением того, что это как если бы папки были заданы с помощью -L
(т.е. библиотеки будут автоматически искать по этому пути). DYLD_FALLBACK_LIBRARY_PATH будет использоваться динамическим компоновщиком (поэтому вам, вероятно, следует включить в эту переменную пути из LIBRARY_PATH).
Подробнее о переменных среды , влияющих на gcc , можно прочитать по ссылке.
Включаемые каталоги заголовков должны быть указаны с опцией -I (после этого требуются только относительные пути), а включаемые каталоги компоновщика - с -L (относительные пути здесь тоже).
Для библиотек в качестве альтернативы вы можете установить LD_LIBRARY_PATH, но метод -L более безопасен.
Ответ довольно сложный.
Короткий ответ: когда вы компилируете свои собственные библиотеки / инструменты, поместите их в какой-нибудь локальный
каталог, такой как вы использовали выше или / usr / local / lib
и / usr / local / include
или даже ~ / local / lib
и ~ / local / include
и всегда добавляйте их в ваш компилятор / компоновщик.
Более длинный ответ - прочтите Programming Library HOWTO для Linux, в котором объясняется, что ищет каждый из задействованных инструментов, от компилятора / компоновщика до исполнения, и взгляните на стандартную структуру каталогов Linux. system , что, конечно, не является обязательным, но это полезно знать.
Я предполагаю, что у вас есть простая установка Makefile для каждого из ваших проектов, поэтому вам не нужно беспокоиться о вводе всех этих команд. Если вы этого не сделаете, я настоятельно рекомендую установить простой шаблон Makefile, который вы можете повторно использовать в своих проектах.
РЕДАКТИРОВАТЬ :
В отредактированном ответе ваши пути могут быть неправильными.
.
в вашем пути, например ./ библиотеки
, указывает текущий каталог, то есть он будет искать в каталоге библиотеки
в текущем каталоге. Если вы разместили каталог библиотеки
в корневом каталоге, удалите каталог .
так должно быть -L / libraries / lib
и аналогично для -I / libraries / ...
Я думаю, ваша проблема может заключаться в том, что ваши аргументы -I тоже нужно передать на этап компиляции. Может быть, что-то вроде этого?
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
Не уверен - я не использовал make-файлы 20 лет (но, как я уже упоминал в комментарии к другому сообщению, я считаю JamPlus весьма примечательным по своим возможностям).
В любом случае - обычно флаги компилятора и компоновщика помещаются в переменные, а затем раскрываются в командной строке, но я не уверен в синтаксисе make для этого. Может быть, просто:
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