2017-02-16 5 views
1

Я создал C++, который работает в Linux, и по его функциональности - выполнить ping на предоставленном хосте. Пинг был основан на соответствующих библиотеках Poco. Однако для того, чтобы успешно работать на Linux произведенную C++ исполняемый файл должен иметь cap_net_raw набор возможностей, даваяКак добавить функцию cap_net_raw через исполняемый файл Makefile to C++ на linux

setcap cap_net_raw=ep /bin/C++_APP 

Я также использовал следующий файл сборки, основываясь на примере я нашел прибегая к помощи.

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 [email protected] $<"; $(CC) $(CFLAGS) $(INC) -c -o [email protected] $< 

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) 

Однако я получил следующее сообщение об ошибке:

Failed to set capabilities on file `bin/NPT' (Invalid argument) The value of the capability argument is not permitted for a file. Or the file is not a regular (non-symlink) file

С другой стороны, когда я даю команду после сборки исполняемого файла C++ все работает нормально. Что я делаю не так?

+0

Есть ли обычный файл под названием «bin/NPT»? Кроме того, где именно вы его добавили? И почему вы использовали '$ (TARGETDIR)/$ (EXECUTABLE)', когда существующие строки используют '$ (TARGET)'? –

+0

@ Давид Шварц, Да NPT - это фактическое имя приложения C++ _. Я добавил команду перед очисткой: У меня такая же ошибка, когда я использовал $ (TARGET), а также – dk13

+0

Возможно, вы захотите положиться на 'pkg-config' вместо жесткого кодирования своих собственных установочных каталогов внешних библиотек (в этом случае , '/ usr/local') в Makefile. Таким образом, другие люди, которые могут скомпилировать вашу программу, не будут проклинать вас ... вместо этого они будут проклинать 'pkg-config'. –

ответ

2

Вы добавили команду в неправильное место. Вам нужно добавить его после исполняемый файл выполнен, а не раньше. Попробуйте следующее:

$(TARGET): $(OBJECTS) 
@echo " Linking..." 
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB) 
@echo " Setting Capabilities"; sudo setcap cap_net_raw=ep $(TARGET) 
+0

Большое спасибо, он отлично работал. – dk13