在我对库进行一些更改之后,我正在尝试使用它们提供的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的含义。但我不知道那段代码是做什么的。
答案 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
并告诉我们会发生什么。
修改:
修改:
“-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)