Почему моя директива include не работает в gcc? - PullRequest
2 голосов
/ 09 августа 2011

Я работаю над кодом, который использует Open Dynamics Engine . Я работал с этим кодом раньше в Windows, но теперь я перехожу на Unix, чтобы получить опыт работы с C в среде Unix, и поэтому я не полагаюсь на Visual Studio. Я загрузил все в свой домашний каталог, собрал с помощью включенного make-файла и попробовал демо; все хорошо. Я сделал каталог и тестовый файл в нем с моим собственным тестом. Для моего #include я указал:

#include ".././ode-0.11.1/include/ode/ode.h"
#include ".././ode-0.11.1/include/drawstuff/drawstuff.h"

Поскольку библиотека находится в моем домашнем каталоге, а не в стандартном месте. Я иду, чтобы скомпилировать мой код, но:

.././ode-0.11.1/include/ode/ode.h:28:27: fatal error: ode/odeconfig.h: No such 
file or directory

Глядя на ode.h, он включает в себя несколько других заголовков, расположенных в одном каталоге, но с использованием синтаксиса скобок вместо кавычек. Я предполагаю, что это как-то связано с тем, почему gcc не может найти другие заголовки. Я посмотрел на make-файлы, но не знаю достаточно, чтобы понять, в чем моя проблема. Почему мой сборник не работает? Хотелось бы получить подробный / подробный ответ, поскольку я хочу узнать, как все это работает (связывание, включение, создание и т. Д.).

Редактировать: Итак, я выяснил, как правильно включать заголовки, теперь мне нужно выяснить, как связать определения библиотек для функций ...

Edit2: до сих пор не могу понять, как сделать ссылку на мой код. Скомпилированные статические библиотеки выгружаются в '~ / ode-0.11.1 / ode / src / .libs' и '~ / ode-0.11.1 / drawstuff / src / .libs' для функций рисования.

Edit3: я думаю, я понял это. Я неправильно использовал параметр -l, и похоже, что он должен идти ПОСЛЕ файлов, которые ссылаются на функции из библиотек, на которые я ссылаюсь.

Ответы [ 2 ]

7 голосов
/ 09 августа 2011

Вам необходимо установить каталог include в строке компиляции

, например

gcc -I.././ode-0.11.1/include

или лучше в этом случае абсолютный путь

Тогда в код включите как

#include "ode/ode.h"
#include "drawstuff/drawstuff.h"

Таким образом, все файлы, включенные в ode.h, будут доступны из одного каталога. Ваш пример ode / odeconfig.h будет найден, так как ode является подкаталогом из пути включения в параметре -I.

Связывание аналогично, но обе части выполняются в командной строке. Две части - это файл, заданный переменной -l, а каталог, в котором находится библиотека, - параметром -L. Кроме того, если библиотека скажет libode.dylib, вы только что назвали имя, например. ода.

Итак, командная строка

gcc -lode -L.././ode-0.11.1/lib
0 голосов
/ 09 августа 2011

перейти в каталог ode-0.11.1 Это будет дом проекта.

Таким образом, включаемые файлы принадлежат каталогу ode-0.11.1 / include В этом случае ваш источник должен быть похож на

myprog.c

#include "ode/ode.h"
#include "drawstuff/drawstuff.h"

Команда компиляции должна иметь вид строки:

gcc -I./include/ode -I./include/drawstuff  myprog.c -o myprog

Команда выполнена в каталоге ode-0.11.1 / include

...