настройка библиотеки включает пути в c ++ - PullRequest
10 голосов
/ 23 марта 2010

Я только что установил gd2 с помощью портов Mac (sudo install 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 в нужных местах для библиотек

Дрю Дж. Сонн.

PS. с помощью: - OSX 10.6.2 - gcc версии 4.2.1 (Apple Inc., сборка 5646) (точка 1)

EDIT: Итак, после учета stfanB и ответа Михаэля, я перекомпилировал gd в локальный каталог (libraries) и, таким образом, я изменил первую строку моего Makefile (я проверю 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

EDIT: Спасибо всем за ответы, вот мой последний (рабочий) 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

Ответы [ 5 ]

14 голосов
/ 23 марта 2010

Вместо того, чтобы напрямую вызывать g ++, я настоятельно советую вам использовать CMake (посмотрите, если вы CMake Google Techtalk , если вы хотите узнать больше), так как это сделает ваш жизненный путьпроще и значительно упрощает поиск и связь с различными библиотеками.Тем не менее, я считаю, что проблема с вашим вызовом заключается в том, что вы не указали библиотеку, что вы бы сделали с -lgd.Ваш -L/opt/local/lib правильно говорит g ++ искать в /opt/local/lib, но вы никогда не говорили ему, что искать.Что касается поиска соответствующего заголовка, вы можете использовать -I/opt/local/include, чтобы поместить /opt/local/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
  • LIBRARY_PATH
  • DYLD_FALLBACK_LIBRARY_PATH

Переменная среды CPATH очень похожа на PATHпеременная окружения (это список каталогов, разделенных двоеточиями), за исключением того, что каталоги в этой переменной будут автоматически использоваться gcc и g ++, как если бы они были указаны в командной строке с флагом -I (т. е. в них будут искать заголовкипути).LIBRARY_PATH является эквивалентом, за исключением того, что это как если бы папки были заданы с -L (т.е. библиотеки будут автоматически искать по этому пути).DYLD_FALLBACK_LIBRARY_PATH будет использоваться динамическим компоновщиком (поэтому вам, вероятно, следует включить пути из LIBRARY_PATH в эту переменную).

Подробнее о переменных среды , влияющих на gcc , можно узнать по ссылке.

3 голосов
/ 23 марта 2010

Ответ довольно сложный.

Краткий ответ, когда вы компилируете свои собственные библиотеки / инструменты, поместите их в какой-то каталог local, такой как вы использовали выше или /usr/local/libи /usr/local/include или даже ~/local/lib и ~/local/include и всегда добавляйте их в свой компилятор / компоновщик.

Более длинный ответ - прочитайте Библиотека программирования HOWTO для Linux, которая объясняет, что каждый изсоответствующий инструмент ищет, от компилятора / компоновщика до исполнения, и смотрит на стандартную структуру каталогов системы Linux , которая, конечно, не является обязательной, но приятно знать.

I 'Я предполагаю, что у вас есть простая настройка Makefile для каждого из ваших проектов, так что вам не придется беспокоиться о наборе всех этих команд.Если вы этого не сделаете, я настоятельно рекомендую установить простой шаблон Makefile, который вы сможете использовать для своих проектов.

EDIT :

В вашем отредактированном ответе ваши пути могут бытьНеправильно.

. в вашем пути, например ./libraries, указывает текущий каталог, то есть он будет смотреть в каталог libraries в текущем каталоге.Если вы указали каталог libraries в корневом каталоге, удалите ., поэтому он должен выглядеть следующим образом -L/libraries/lib и аналогично для -I/libraries/...

1 голос
/ 23 марта 2010

Я думаю, что ваша проблема может заключаться в том, что ваши аргументы -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
1 голос
/ 23 марта 2010

В заголовочных каталогах необходимо указывать опцию -I (после этого нужны только относительные пути), а компоновщик включает в себя каталоги с -L (здесь тоже относительные пути).

Для библиотек, альтернативно, вы можете установить LD_LIBRARY_PATH, но метод -L безопаснее.

0 голосов
/ 03 июля 2013

Вам нужно использовать -iquote при использовании #include "gd.h", см. Документацию по параметрам каталога gcc .

Кроме того, указывать каталог включения на этапе ссылки бессмысленно.

...