Ошибка при запуске: очистить - PullRequest
1 голос
/ 11 ноября 2011

Я пытаюсь создать какое-то программное обеспечение для моделирования, используя make-файл, предоставленный ими после того, как я внес некоторые изменения в библиотеки. Но когда я запускаю make clean, он останавливается на полпути, и я получаю следующую ошибку


rm: invalid option -- 'l'
Try `rm --help' for more information.
make: *** [neat] Error 1

Я проверил справочную страницу для rm, и нет опции -l, но я не знаю, почему эта команда выполняется с опцией -l. Есть ли способ игнорировать это или узнать, какой конкретный файл вызывает проблему?

EDIT:

  • Я выяснил источник ошибки, но не знаю, как отредактировать ее, чтобы она работала правильно. Ниже приведен фрагмент включенного файла Makefile с ошибочной строкой:

    UDP_INTERFACE_SRCS = \ $ (UDP_INTERFACE_DIR) /interfaceudp_app.cpp \ $ (UDP_INTERFACE_DIR) /interfaceudp.cpp \ $ (UDP_INTERFACE_DIR) /external_interface_udp.cpp \ $ (UDP_INTERFACE_DIR) /packet_send.cpp \ $ (UDP_INTERFACE_DIR) /addr.cpp \ $ (UDP_INTERFACE_DIR) /packet_capture.cpp -lpcap \ $ (UDP_INTERFACE_DIR) /queue.cpp

В частности, строка: $ (UDP_INTERFACE_DIR) /packet_capture.cpp -lpcap \ вызывает ошибку. Что делает "-lpcap", добавленный после "packet_capture.cpp"? Теперь, если я пытаюсь удалить его, «make» выдает ошибку, говорящую:

./interfaces/extinterface/src/packet_capture.o: In function pcap_sniff_packets(void*)': /home/qualnet/4.5/main/../interfaces/extinterface/src/packet_capture.cpp:63: undefined reference to pcap_setdirection' make: *** [../bin/qualnet] Error 1

Я проверил строку 63 в файле packet_capture.cpp, чтобы понять, что означает -lpcap. Но я понятия не имею, что делает этот код.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2011

(Это явно итеративный процесс, и комментарии становятся длиннее, поэтому я бы лучше начал ответ.)

Вы говорите: «Когда я добавляю echo SIM_JOBS: $ (SIM_OBJS) в правило, при запуске make clean я получаю следующее: rm -f ../bin/qualnet ../bin/radio_range"

Это не имеет смысла. Вы должны получить что-то вроде

SIM_JOBS: ../bin/qualnet ../bin/radio_range
rm -f ../bin/qualnet ../bin/radio_range

или

SIM_JOBS: something/else
rm -f ../bin/qualnet ../bin/radio_range

или хотя бы

SIM_JOBS:
rm -f ../bin/qualnet ../bin/radio_range

Это говорит о том, что вы смотрите на неправильное правило: правило, которое выдает rm -f ../bin/qualnet ../bin/radio_range, является , а не правилом, в которое вы положили команду echo .... Если это является правилом и вы просто неточны в отчете, поместите это прямо над clean правилом:

SIM_JOBS=../bin/qualnet ../bin/radio_range

и расскажите нам, что происходит.

EDIT:

  1. Извините, я написал `SIM_JOBS`, когда имел в виду` SIM_OBJS`.
  2. Команда `echo` была вне правила, где она не может работать.
  3. Похоже, проблема. Не могли бы вы отредактировать свой вопрос, чтобы показать строку, которую вы упомянули в @thiton, и несколько предыдущих строк? Похоже, что флаг "-lpcap" попадает в переменную, где он не принадлежит.

EDIT:
«-Lpcap» - это кладжа. Я предполагаю, что это опция, предназначенная для компоновщика. Предположим, вы хотите связать несколько объектных файлов в исполняемый файл и выполнить поиск в определенной библиотеке с именем «pcap»:

gcc foo.o -lpcap bar.o baz.o

Порядок очень важен; когда компоновщик что-то ищет, вы хотите, чтобы он сначала искал foo.o, затем pcap, затем bar, затем baz. Это вопрос приоритета. Но вы хотите сохранить эти имена файлов в красивой аккуратной переменной, и как вы вставите lpcap в нужное место? Вы могли бы сделать это хорошим способом или использовать ленивый хак, как это:

OBJECTS = foo.o -lpcap bar.o baz.o
gcc $(OBJECTS)

И если вы выводите ОБЪЕКТЫ из ИСТОЧНИКОВ, вы должны поставить хак раньше:

SOURCES = foo.cc -lpcap bar.cc baz.cc
OBJECTS = $(SOURCES:.cc=.o)

Кто бы ни писал эти make-файлы, он сэкономил полчаса с этим клуджем, и на его исправление у вас ушли дни. Если вы можете подтвердить, что это именно то, что происходит, проще всего, вероятно, разделить список на две части:

SOURCES_LEFT = foo.cc
SOURCES_RIGHT = bar.cc baz.cc
OBJECTS_LEFT = $(SOURCES_LEFT:.cc=.o)
OBJECTS_RIGHT = $(SOURCES_RIGHT:.cc=.o)
gcc $(OBJECTS_LEFT) -lcap $(OBJECTS_RIGHT)
0 голосов
/ 12 ноября 2011

Как отметил @AndrejPanjkov в комментариях, стандартным инструментом для определения того, что именно происходит в Makefiles, является переключатель -n (--dry-run) make. Он печатает все команды, которые будут выполняться оболочкой, даже те, которые обычно отключены (например, через @).

Посмотрите в этом выводе долго и внимательно на любой шаблон, например, '-l' (добавьте вывод в меньше и используйте / help). Если это не помогает, попробуйте запустить все команды, выводимые вручную -n, в оболочке make (обычно /bin/sh) или попробуйте удалить все глушители (@ символов в начале правила) из Makefile и запустить make clean, проверка последней строки вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...