运行时出错:make clean

时间:2011-11-11 06:10:57

标签: makefile

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


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

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

编辑:

  • 我已经找到了错误的来源,但不知道如何编辑它以使其正常工作。下面是包含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 \ 导致错误。在“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的含义。但我不知道那段代码是做什么的。

2 个答案:

答案 0 :(得分:0)

就像@AndrejPanjkov在评论中指出的那样,找出Makefile中究竟发生了什么的标准工具是make的-n--dry-run)开关。它打印所有命令,因为它们将由shell运行,甚至是那些通常被静音的命令(例如通过@)。

对于任何类似于'的模式,请仔细查看此输出。 -l' (将输出管道连接到less并使用/帮助)。如果这没有帮助,请尝试在make的shell(通常是/bin/sh)中手动运行-n输出的所有命令,或者尝试删除所有的消音器(@字符符合规则&从Makefile开始运行make clean,检查输出的最后一行。

答案 1 :(得分:0)

(这显然是一个迭代过程,评论越来越长,所以我最好开始回答。)

你说:“当我在规则中放入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”是一个kludge。我的猜测是它是一个用于链接器的选项。假设您要将一堆目标文件链接到可执行文件中,并且您想要搜索名为“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,那么您必须先进行攻击:

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)