2016-09-13 3 views
0

Я работаю над написанием своего первого файла makefile и после нескольких уроков и чтения некоторых ссылок на stackoverflow мне удалось записать файл, что я делаю этоGNU make issue: «Нет правила для создания цели« pjsip.h », необходимого« main.o »

  • используя .а файлы из pjsip апи, обратите внимание на переменные PJSIP, PJLIB_UTIL и PJLIB
  • определить путь к .h файл, используя - I, см. Переменные PJSIP_HDR, PJLIB_HDR и PJLIB_U_HDR

Я получаю следующее сообщение об ошибке:

make: ***No rule to make target `pjsip.h', needed by `main.o'. Stop. 

Это считают, что это полезно упомянуть, что у меня есть только 4 директив #includes в моем .cpp файл

#include <iostream> 
#include <pjsip.h> 
#include <pjlib-util.h> 
#include <pjlib.h> 

Цель состоит в том, чтобы иметь файл main который можно исправить, я использую Ubuntu 14.04. Вот мой Makefile

CC = g++ 
DEBUG = -g 
CFLAGS = -Wall -c $(DEBUG) 
LFLAGS = -Wall $(DEBUG) 
PJSIP = -L/home/ubuntu/pjsip/trunk/pjsip/lib -llibpjsip-simple-x86_64-unknown-linux-gnu.a -llibpjsip-ua-x86_64-unknown-linux-gnu.a -llibpjsip-x86_64-unknown-linux-gnu.a -llibpjsua2-x86_64-unknown-linux-gnu.a -llibpjsua-x86_64-unknown-linux-gnu.a 
PJLIB = -L/home/ubuntu/pjsip/trunk/pjlib/lib -llibpj-x86_64-unknown-linux-gnu.a 
PJLIB_UTIL = -L/home/ubuntu/pjsip/trunk/pjlib-utils/lib -llibpjlib-util-x86_64-unknown-linux-gnu.a 
PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/ 
PJLIB_HDR = -I/home/ubuntu/pjsip/trunk/pjlib/include/ 
PJLIB_U_HDR = -I/home/ubuntu/pjsip/trunk/pjlib-utils/include 

main: main.o 
     $(CC) $(LFLAGS) main.o -o main 

main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h 
     $(CC) $(CFLAGS) $(PJSIP_HDR) $(PJLIB_HDR) $(PJLIB_U_HDR) main.cpp $(PJSIP) $(PJLIB) $(PJLIB_UTIL) 

clean: 
     \rm -f *.o 

Любые дополнительные комментарии, которые могут помочь мне улучшить мой Makefile Приветствуются

Заранее спасибо

+0

Сначала попробуйте написать командную строку, прежде чем приступать к созданию Makefile. –

+0

I jusd сделал, как вы рекомендуете, когда я это сделаю, я получаю вывод, который заставляет меня поверить, что я ошибаюсь в связи .a и включая файлы .h. это часть вывода: main.cpp :(. text + 0x1da): undefined ссылка на 'pj_init ' main.cpp :(. text + 0x233): неопределенная ссылка на' pjlib_util_init' main.cpp :(. text + 0x27f): неопределенная ссылка на 'pj_pool_factory_default_policy ' –

+0

В этом случае файл cpp не является проблемой: make сообщает вам, что он не может найти необходимый файл для рецепта. Я считаю странным, что вы делаете «PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/pjsip.h», а затем используйте его с директивой -I ... Вы пытались удалить имя файла из определения? , Когда вы используете -I вы должны использовать include paths, правильно ?. –

ответ

3

Проблема в том, что вы указываете зависимость pjsjp.h как, например, после «:» в строке для цели main.o); но make не знает, как найти файл include pjsip.h - он не интерпретирует параметры -I ..., это только для команды g ++.

Вы могли бы попытаться указать абсолютный путь, что-то вроде этого:

PJLIB_HEADER_DIR=/home/ubuntu/pjsip/trunk/pjlib/include 
main.o: main.cpp $(HEADER_DIR)/pjlib.h ... 

(...и аналогичные для других заголовков) Кстати, опция «-I» принимает только каталоги (см. g ++ documentation on directory search), поэтому определение PJSIP_HDR с именем заголовка в нем не имеет смысла, оно должно быть просто:

PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/ 

Возможно, вы добавили название заголовка из-за ошибки?

Второй, более простой вариант - просто удалить эти внешние зависимости. Просто напишите

main.o: main.cpp 

, то есть оставьте все файлы заголовков библиотеки. Dependecies должны сказать make перестроить материал, если зависимость изменилась. Я предполагаю, что эти pjsip.h, pjlib.h, ... происходят из внешней библиотеки, которую вы часто не меняете? Тогда сделать это зависимость в make не обязательно.

Кстати, в наши дни файлы с трудом записываются вручную; они обычно генерируются такими инструментами, как cmake.

+0

Я получаю следующее сообщение об ошибке после того, как отредактировал его в соответствии с вашими рекомендациями: *** Нет правила для создания цели '/home/ubuntu/pjsip/trunk/pjsip/include//pjsip.h ', необходимого' main.o ». Стоп. –

+0

У меня, вероятно, был неправильный путь. Проверьте, по какому пути файл pjsip.h действительно существует. Но также проверьте второй, более простой вариант, который у вас есть, который я теперь добавил к ответу: просто не учитывайте внешние зависимости заголовка. – codeling

+0

Удаление зависимостей решило проблему и спасибо за рекомендацию cmake. Я буду отмечать этот ответ как правильный. –

3

следующее правило:

main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h 

указывает, что main.o требует все перечисленные файлы для создания.

У вас нет файла с именем pjsip.h в текущем каталоге. Это то, что вам говорит make: этот файл не существует, и нет явного правила для создания этого файла.

Сообщение об ошибке, которое вы указали, находится от make. make не смотрит, и не волнует, что вы передаете какой-то флаг -I на какую-то странно названную команду под названием g++, которая выполняется для построения main.o. make ничего не знает о g++, ни о каких-либо флагах, переданных ему. Все, что делает, знает или заботится о явно перечисленных целях и правилах.

+0

Сэм прямо здесь. Когда вы укажете все эти пути к файлу, это не для «make», а для вашей цепочки компиляции. Где находятся эти файлы заголовков ?. –

+0

Даже если я пишу весь путь к файлам, он не решает проблему. Вот расположение файлов, но, как я уже говорил, полный путь не помогает/home/ubuntu/pjsip/trunk/pjsip/include// home/ubuntu/pjsip/trunk/pjlib/include// home/ubuntu/pjsip/trunk/pjlib-utils/include –

+0

«Это все еще не работает» не является полезным описанием проблемы. –

Смежные вопросы