Я создал 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++ все работает нормально. Что я делаю не так?
Есть ли обычный файл под названием «bin/NPT»? Кроме того, где именно вы его добавили? И почему вы использовали '$ (TARGETDIR)/$ (EXECUTABLE)', когда существующие строки используют '$ (TARGET)'? –
@ Давид Шварц, Да NPT - это фактическое имя приложения C++ _. Я добавил команду перед очисткой: У меня такая же ошибка, когда я использовал $ (TARGET), а также – dk13
Возможно, вы захотите положиться на 'pkg-config' вместо жесткого кодирования своих собственных установочных каталогов внешних библиотек (в этом случае , '/ usr/local') в Makefile. Таким образом, другие люди, которые могут скомпилировать вашу программу, не будут проклинать вас ... вместо этого они будут проклинать 'pkg-config'. –