如何通过 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?

单文件夹下的C程序如何编写Makefile文件

如何创建仅包含主文件和模板头 (C++) 的 makefile

内核makefile里面的如何定义宏

linux 5如何安装makefile软件

如何在makefile中指定头文件目录