установка библиотеки включает пути в C++

Я просто установил 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
10
задан Drew 23 March 2010 в 02:10
поделиться

4 ответа

Вместо прямого вызова 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
  • LIBRARY_PATH
  • ] DYLD_FALLBACK_LIBRARY_PATH

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

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

14
ответ дан 3 December 2019 в 20:03
поделиться

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

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

1
ответ дан 3 December 2019 в 20:03
поделиться

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

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

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

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

РЕДАКТИРОВАТЬ :

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

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

3
ответ дан 3 December 2019 в 20:03
поделиться

Я думаю, ваша проблема может заключаться в том, что ваши аргументы -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
ответ дан 3 December 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: