如何通过 Makefile 将 cap_net_raw 功能添加到 Linux 上的 c++ 可执行文件
Posted
技术标签:
【中文标题】如何通过 Makefile 将 cap_net_raw 功能添加到 Linux 上的 c++ 可执行文件【英文标题】:How to add cap_net_raw capability via a Makefile to c++ executable file on linux 【发布时间】:2017-02-16 21:08:13 【问题描述】:我创建了一个在 Linux 上运行的 c++,其功能之一是在提供的主机上 ping。 ping 是基于相关的 Poco 库。然而,为了在 linux 上成功运行,生成的 c++ 可执行文件应该具有 cap_net_raw
功能,通过给设置
setcap cap_net_raw=ep /bin/C++_APP
我还根据我通过谷歌搜索找到的示例使用了以下 Makefile。
CC := g++
# Folders
SRCDIR := src
BUILDDIR := build
TARGETDIR := bin
# Targets
EXECUTABLE := C++_APP
TARGET := $(TARGETDIR)/$(EXECUTABLE)
SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
CFLAGS := -c -Wall
INC := -I include -I /usr/local/include
LIB := -L /usr/local/lib -lPocoFoundation -lPocoNet -lPocoUtil
$(TARGET): $(OBJECTS)
@echo " Linking..."
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
@mkdir -p $(BUILDDIR)
@echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<
clean:
@echo " Cleaning...";
@echo " $(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)
.PHONY: clean
我添加了以下命令作为最后的构建命令
@echo "Setting Capabilities"; sudo setcap cap_net_raw=ep $(TARGETDIR)/$(EXECUTABLE)
但是我得到了以下错误:
未能在文件“bin/NPT”上设置功能(无效参数) 文件不允许使用能力参数的值。或者 文件不是常规(非符号链接)文件
另一方面,当我在构建 c++ 可执行文件后发出命令时,一切正常。我做错了什么?
【问题讨论】:
是否有一个名为bin/NPT
的常规文件?另外,你到底是在哪里添加的?当现有线路使用$(TARGET)
时,您为什么使用$(TARGETDIR)/$(EXECUTABLE)
?
@David Schwartz,是的,NPT 是 C++_app 的实际名称。我在 clean 之前添加了命令:我在使用 $(TARGET) 时也遇到了同样的错误
您可能希望依赖pkg-config
而不是将您自己的外部库安装目录(在本例中为/usr/local
)硬编码到 Makefile 中。这样,其他可能编译你的程序的人就不会诅咒你......他们会诅咒pkg-config
。
【参考方案1】:
您在错误的位置添加了命令。您需要在生成可执行文件之后添加它,而不是之前。试试这个:
$(TARGET): $(OBJECTS)
@echo " Linking..."
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)
@echo " Setting Capabilities"; sudo setcap cap_net_raw=ep $(TARGET)
【讨论】:
以上是关于如何通过 Makefile 将 cap_net_raw 功能添加到 Linux 上的 c++ 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C makefile 移植到 C++ makefile?