【问题标题】:Error when running: make clean运行时出错:make clean
【发布时间】:2011-12-26 18:44:20
【问题描述】:

在对库进行了一些更改后,我正在尝试使用他们提供的 makefile 构建一些模拟软件。但是当我运行 make clean 时,它会中途停止并出现以下错误


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

我检查了rm 的手册页并且没有-l 选项,但我不知道为什么要使用-l 选项执行此命令。有没有办法忽略这一点,或者找出导致问题的特定文件?

编辑:

  • 我已经找出错误的来源,但不知道如何编辑它以使其正常工作。以下是包含的 Makefile 中的 sn-p 错误行:

    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 \ 导致错误。在“packet_capture.cpp”之后添加的“-lpcap”有什么作用?现在,如果我尝试删除它,“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

我检查了 packet_capture.cpp 中的第 63 行,试图理解 -lpcap 的含义。但我不知道该代码的作用。

【问题讨论】:

  • 你能展示你的make文件吗?
  • 尝试 make -n 看看它想做什么
  • @Andrej 嘿,谢谢 make clean -n 工作!那是什么意思? -n 选项有什么作用?
  • @CodeBuzz 有多个 Makefile.. 一个 Makefile 包含更多
  • @AndrejPanjkov make clean -n 不会产生任何错误。但是当我在“make clean -n”之后运行“make”时,它表示“all”没有什么可做的

标签: makefile


【解决方案1】:

(这明明是一个迭代的过程,而且cmet越来越长,所以我最好开始一个答案。)

您说:“当我将 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

告诉我们会发生什么。

编辑:

  1. 抱歉,当我指的是“SIM_OBJS”时,我写了“SIM_JOBS”。
  2. `echo` 命令超出规则,无法正常工作。
  3. 看起来好像有问题。您能否编辑您的问题以显示您对@thiton 提到的行以及之前的几行?看起来好像标志“-lpcap”正在进入一个不属于它的变量。

编辑:
“-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 中推断出 OBJECTS,则必须更早地加入 hack:

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

编写这些makefile 的人用这个kludge 节省了半个小时,而修复它需要几天时间。如果您可以确认这是正在发生的事情,最简单的方法可能是将列表一分为二:

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)

【讨论】:

  • 我在这里有点困惑。这是包含 echo 的 Makefile 的 sn-p。希望我把它放在正确的位置:##Target "neat" 删除名称末尾带有 ~ 的所有对象和(临时)文件。 # 整洁:rm -f $(OBJS) 核心 ../*/*~ ../*/*/*~ osneat: rm -f $(OS_OBJS) 核心 ../*/*~ ../*/* /*~ # # Target "clean" 执行 "neat" 的规则,并删除所有 # 可执行文件。 # echo SIM_JOBS:$(SIM_OBJS) clean: clean rm -f $(SIM_EXEC) $(RADIO_RANGE_EXEC) $(CES_EXEC) $(MTS_EXEC) $(MTS2_EXEC) realclean: clean kernelclean privateclean
  • 当我运行它时,没有运行 echo 语句.. 再次显示带有无效选项输出的相同 rm。但是,我已经在主 Makefile 中包含的 Makefile 之一中找出了罪魁祸首。您能否看看我对@thiton 的回答的评论并帮助我编辑以正常工作
  • 其实早些时候我已经将 echo 语句放在目标“整洁”的规则中,因为目标清理具有“整洁”作为依赖项。当我运行“make quiet”时,我得到了与 make clean 相同的操作。
  • 您好,感谢您的帮助。我没有按照您的建议将其分成两行,而是在“整洁”规则中调整了 rm 命令.. 如下:code整洁:rm -f -- $(OBJS) core ../*/ *~ ../*/*/*~ code "clean" 的规则将 "neat" 作为依赖项.. 而 "--" 表示没有其他选项.. 现在 make clean 和 make run without错误..
【解决方案2】:

就像在 cmets 中提到的 @AndrejPanjkov 一样,找出 Makefile 中到底发生了什么的标准工具是 make 的 -n (--dry-run) 开关。它打印所有命令,就像它们将由 shell 运行一样,即使是那些通常静音的命令(例如通过 @)。

仔细查看此输出中的任何模式,例如“-l”(将输出管道化为 less 并使用 / 帮助)。如果这没有帮助,请尝试在 make 的 shell(通常为 /bin/sh)中手动运行 -n 输出的所有命令,或尝试从 Makefile 中删除所有消音器(规则开头的@ 字符)并运行 make clean,检查输出的最后一行。

【讨论】:

  • 我终于设法在 Makefile 中找到导致问题的主 Makefile 中包含的一行。它的内容为:$(UDP_INTERFACE_DIR)/packet_capture.cpp -lpcap \ 你能告诉我是什么函数“-lpcap”声明。
  • 当我尝试删除“-lpcap”选项时。 “make clean”运行没有错误。但是“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'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多